php 대상 을 대상 으로 하 는 기초 상세 설명[스타 크 래 프 트 게임 사례]

본 고의 실례 는 php 가 대상 을 향 한 기 초 를 서술 하 였 다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
머리말
대상 을 향 해 넓 고 심오 하 며 한 번 도 접 해 본 적 이 없 는 사람 에 게 는 안개 가 느껴 진다.
학습 자 료 는 많 지만 대부분 추상 적 이기 때문에 저 는 전형 적 인 게임-스타 크 래 프 트 로 PHP 대상 을 토론 합 니 다.
지금 은 우리 가 PHP 로 스타 크 래 프 트 를 개발 하여 PHP 를 대상 으로 한다 고 가정 합 니 다.
학습 에 편리 하도록 특수 설명 을 제외 하고 각 부분 코드 간 에는 관련 이 없습니다.그리고 같은 일 은 종종 다른 코드 를 사용한다.
그리고 나 도 각 병종 의 속성 숫자 를 고증 하지 않 고 설명 만 한다.
클래스 와 대상
만약 에 게이머 가 기관총 병 을 만 들 었 다 면 우 리 는 그 를 어떻게 표시 합 니까?왜냐하면 모든 기관총 병 은 몇 가지 기본 적 인 데 이 터 를 기록 해 야 하기 때 문 입 니 다.남 은 피,적 을 죽 이 는 수량,공 격 력 등 이 있 습 니 다.
우 리 는 하나의 수조 로 한 기관총 병 의 남 은 피 와 적 을 죽 이 는 수량 을 기록 할 수 있다.왜냐하면 이것 은 모든 기관총 병 에 게 독립 적 이기 때문이다.
하지만 공 격 력 이 까다 롭 습 니 다.업 그 레이 드 를 통 해 공 격 력 이 증가 하기 때문에 기관총 병 을 나타 내 는 모든 수 조 를 찾 아 수정 해 야 합 니 다.귀 찮 습 니 다.
여기 서 우 리 는 먼저 모든 기관총 병 이 독립 된 데 이 터 를 기록 하고 수정 해 야 한 다 는 것 을 알 수 있다.예 를 들 어 남 은 피 등 이다.동시에 그들 은 공 격 력 같은 데 이 터 를 공유 해 야 한다.
이 럴 때 상 대 를 향 해 우 리 를 도 울 수 있 을 거 야.
1.1 클래스 의 정의
우 리 는 먼저 일부 문 제 를 처리 하 는데,즉 모든 기관총 병 만 의 데이터 이다.

<?php 
  class marine
  {
    public $blood = 50; //    
    public $kills = 0; //    
    //    (      )             
    function attack($enemy)
    {
      //       
    }
  }
?>

이것 은 클래스 라 고 합 니 다.우 리 는 모든 기관총 병 을 나타 내 는 클래스 마리 인 을 만 들 었 습 니 다.이 안 에는 모든 병사 만 의 데이터 가 필요 합 니 다.예 를 들 어 위의 코드 에 남 은 피 등 이 있 습 니 다.
1.2 대상 의 생 성과 사용
다음은 우리 가 사용 할 대상,즉 모든 기관총 병 이다.

<?php
  $m1 = new marine();
?>

new 뒤에 클래스 이름과 괄호 를 추가 합 니 다.우 리 는 기관총 병$m1,$m1 을 클래스 marine 의 대상 이 라 고 부 릅 니 다.우 리 는 그것 을 특수 변수 로 상상 할 수 있 습 니 다.단지 여러 개의 데 이 터 를 저장 하고 있 을 뿐 입 니 다.
어떤 기관총 병 의 피(대상 의 속성)를 사용 하거나 조작 해 야 한다 면$m1->blood 로 표시 하면 된다.echo$m1->blood;/기관총 병$m1 남 은 피 출력
우 리 는 기관총 병 을 하나 더 세 웠 다.

<?php 
  $m2 = new marine();
?>

이때$m1 이 적 에 게 공격 당 하면 10 개의 피 가 남 습 니 다.$m2 는 공격 을 받 지 않 았 습 니 다:

<?php
  echo $m1->blood;//   10
  echo $m2->blood;//   50
?>

사용 대상 은 각 기관총 병 의 피 를 간단하게 보존 할 수 있어 서로 영향 을 주지 않 는 다.
만약 기관총 병$m1 이 적 을 공격 할 때,이렇게 대상 을 사용 할 수 있 는 방법:

<?php
  $m1->attack($z1);//             $z1
?>

서로 다른 클래스 에 서 는 같은 이름 의 함 수 를 사용 할 수 있 습 니 다.예 를 들 어 강아지 류 Zergling 에 도 함수 attack 이 있 을 수 있 습 니 다.
주의해 야 할 것 은 PHP 5 부터 대상 의 속성 을 어디서 바 꾸 든 지 바 꿀 수 있다 는 것 이다.예 를 들 어 위의 강아지 대상 이 매개 변수 로 기관총 병 의 attack 함수 에 전달 되 었 고 함 수 를 실행 한 후에 이 강아지 대상 의 피 가 감소 했다.이것 은 일반적인 함수 와 다르다.하지만 강아지 가 공격 을 받 으 면 피 가 줄 어야 한 다 는 것 은 직관 적 이다.
2.구조 함수 와 분석 함수
우리 가 기관총 병 을 새로 만 들 때마다 총 인 구 는 1 을 더 해 야 한다.만약 기관총 병 이 살해당 한다 면 인 구 는 1 을 줄 여야 한다.
구조 함수 와 분석 함 수 를 통 해 자동 으로 처리 할 수 있 습 니 다.

<?php
  class marine
  {
    //    
    function __construct()
    {
      //        
    }
    //    
    function __destruct()
    {
      //        
    }
  }
?>

한 클래스 에서 이름 은construct 의 함 수 는 구조 함수 라 고 합 니 다.new 가 클래스 의 대상 을 새로 만 들 때마다 실 행 됩 니 다.

<?php
  $m1 = new marine();//                marine     ,       
?>

한 클래스 에서 이름 은destruct 의 함 수 는 석조 함수 라 고 하 는데,클래스 의 대상 을 없 앨 때마다 실 행 됩 니 다:

<?php
  unset($m1);//unset      ,        。                marine     ,       
?>

정적
기관총 병 의 공 격 력 은 모든 기관총 병 의 대상 에 속 하 며,각 기관총 병 의 공 격 력 은 동일 하 므 로,진급 하면 함께 변화 해 야 한다.
이것 은 static 를 사용 하여 정적 을 표시 합 니 다.

<?php
  class marine
  {
    static $attackNumber = 10; //      
    //                 
    function attack($enemy)
    {
      //       ,$enemy->blood          
      $enemy->blood -= self::$attackNumber;
    }
  }
?>

정적 속성 은 클래스 의 모든 대상 이 공유 하 는 속성 을 나타 내 고 바 뀌 면 모든 대상 이 달라 집 니 다.
정적 속성 은 static 로 시작 합 니 다.예 를 들 어 위의 static$attackNumber 입 니 다.
정적 속성 은 클래스 로 직접 접근 할 수 있 습 니 다:

<?php
  echo marine::$attackNumber;//  10
?>

클래스 내의 함수 에 접근 하면 self::$attackNumber 로 이 클래스 의$attackNumber 속성 을 표시 합 니 다.
그래서 만약 에 우리 가 기관총 병 의 공 격 력 을 업그레이드 하면 모든 기관총 병 이 영향 을 받는다.이것 이 바로 대상 을 대상 으로 하 는 장점 중 하나 이 고 우리 가 앞에서 토론 한 공동 데이터 문 제 를 해결 했다.
함수 도 정적 일 수 있 습 니 다.이렇게 하면 클래스 로 직접 접근 할 수 있 습 니 다.새 대상 으로 호출 할 필요 가 없습니다.

<?php 
  class marine
  {
    static $attackNumber = 10; //      
    //                
    staticfunction upgrade()
    {
      self::$attacknum++;
    }
  }
?>

만약 에 과학 기술 건축 의 업그레이드 가 끝나 면 이 함 수 를 직접 호출 합 니 다.

<?php
  marine::upgrade();
?>

상속
병영 은 기관총 병 을 만 드 는 데 쓰 이 고 탱크 방 은 탱크 를 만 드 는 데 쓰 인 다.그들 은 모두 건축 이지 만 많은 차이 가 있다.만약 에 하나의'건축'으로 표시 하면 매우 어렵다.
그러나 우 리 는 그들의 공통점 을 유지 해 야 한다.예 를 들 어 모두 비행 할 수 있 고 비행 하 는 코드 가 여러 가지 유형 에서 중복 되 는 것 을 원 하지 않 으 며 그들 로 하여 금 각자 독립 적 으로 다른 것 을 생산 하 게 해 야 한다.
그래서 우 리 는 상속 으로 처리 할 수 있다.상속 은 부자 관 계 를 나타 내 고 상 속 된 것 을 부류 라 고 부 르 며 상 속 된 것 을 부류 라 고 부른다.계승

<?php 
  //   
  class building
  {
    function fly()
    {
      //       
    }
  }
  //   
  class marineBuilding extends building
  {
    function createMarine()
    {
      //        
    }
  }
  //    
  class tankBuilding extends building
  {
    function createTank()
    {
      //       
    }
  }
?>

다음은 계승 에 따 른 효 과 를 살 펴 보 자.

<?php 
  //        :
  $mb1 = new marineBuilding();
  //       ,             fly(),               
  $mb1->fly();
  //           :
  $mb1->createMarine();
?>

건축 류 를 계승 하 는 탱크 방 류 는 기관총 병 을 만 들 수 없다.병영 류 의 개성 이기 때문이다.
하위 클래스 의 함수 가 부모 클래스 의 함 수 를 호출 하려 면 parent 를 사용 해 야 합 니 다.예 를 들 어 parent::fly()
주의 하 세 요.한 종 류 는 한 부모 만 있 을 수 있 습 니 다.PHP 는 다 중 상속 을 허용 하지 않 습 니 다.즉,한 아 이 는 한 아버지 만 있 을 수 있 고 한 아버 지 는 N 명의 아 이 를 가 질 수 있 습 니 다!
5.액세스 제어
$attackNumber=10 으로 속성 을 표시 하면 시스템 은 기본적으로 Public$attackNumber=10 이 므 로 이렇게 쓰 는 것 을 권장 합 니 다.

<?php 
  class marine
  {
    public static $attackNumber = 10; //      
  }
?>

Public 는 이 속성 이 공공 적 이 고 어디서 든 접근 하고 조작 할 수 있다 는 것 을 나타 낸다.
그러나 이것 은 문제 가 있 습 니 다.만약 에 게이머 들 이 마리 네 와 같은 코드 구 조 를 알 게 된다 면 그 는 간단 한 패 치 프로그램 을 만들어 서 실행 할 때 불 러 옵 니 다.

<?php
  //  
  marine::$attackNumber = 10000;
?>

그렇다면 그의 기관총 병 은 10000 의 공 격 력 을 가지 고 있다.하하,그렇다면 누가 그 를 이 길 수 있 겠 는가!
이 속성 은 클래스 의 함수 만 접근 할 수 있 음 을 private 로 표시 합 니 다.

<?php 
  class marine
  {
    private static $attackNumber = 10; //      
    //                
    function upgrade()
    {
      //        
      if(self::$attacknum<13)
      {
        self::$attacknum++;
      }
    }
  }
?>

이렇게 되면 업 그 레이 드 를 해야만 기관총 병 의 공 격 력 을 바 꿀 수 있다.
그러나 지금 은 팀 개발 이 고 사용 되 는 계승 이 많 습 니 다.private 라면 하위 클래스 는 방문 할 수 없 지만 어떤 속성 을 마음대로 수정 하 는 것 을 원 하지 않 습 니 다.
그러면 proctected,proctected 의 속성 으로 하위 클래스 의 함수 에 접근 할 수 있 습 니 다.
6.무 거 운 짐
6.1 속성 리 셋
만약 우리 가 지상 부 대 를 하나의 유형 으로 삼 아 기관총 병 류 로 그 를 계승 하 게 한다 면,이때 지상 부대 류 와 기관총 병 류 에서 공 격 력$attack Number 를 정의 한다 면,모든 병 의 공 격 력 은 지상 부대 가 아니 라 기관총 병 류 에 의 해 결정 된다.무 거 운 짐 이 라 고 합 니 다.

<?php 
  //    
  class groundArmy
  {
    public $attackNumber = 5;
  }
  //   
  class marine extends groundArmy
  {
    public $attackNumber = 10; //      
  }
  $m1 = new marine();//       
  echo $m1->attackNumber;//      10
?>

6.2 함수 과부하
다시 불 러 오 는 것 도 함수 에 사용 할 수 있 습 니 다.하위 클래스 의 함수 가 부모 클래스 함수 와 같 으 면 따로 설명 하지 않 으 면 하위 클래스 의 대상 은 기본적으로 하위 클래스 의 함 수 를 호출 합 니 다.
예 를 들 어 인간 종족 의 귀 병 류 고 스 트 와 신 족 류 의 어두 운 성당 류(은 도)는 모두 스텔스 병종 이지 만 귀 병 이 스텔스 할 때 에 너 지 를 감소 시 키 고 어둠 의 성당 은 에너지 속성 이 전혀 없다.
만약 에 우리 가 스텔스 능력 을 부류 로 한다 면 귀 병 류 고 스 트 와 신 족 류 의 어두 운 성당 류 DarkTemplar 는 이 를 계승 하 는 동시에 서로 다른 스텔스 코드 를 실현 합 니 다.

<?php
  //     
  class concealAbility
  {
    //             
    function conceal()
    {
      //       
    }
  }
  //   
  class ghost extends concealAbility
  {
    $energy = 150;
    //             
    function conceal()
    {
      //       
      //       ,$this      ,         
      $this->energy -= 25;
    }
  }
  //     
  class DarkTemplar extends concealAbility
  {
    //             
    function conceal()
    {
      //       ,     
    }
  }
  //      
  $g1 = new ghost();
  //     150
  echo $g1->energy;
  //    
  $g1->conceal();
  //     125
  echo $g1->energy;
  //        
  $d1 = new DarkTemplar();
  //      ,       
  $g1->conceal();
?>

인터페이스
PHP 가 다 중 상속 을 허용 하지 않 으 면 문제 가 있 습 니 다.
만약 규범 적 인 처 리 를 위해 우리 가 스텔스 능력 을 하나의 유형 으로 만 든 후에 비행 능력 을 하나의 유형 으로 놓 으 면 인류의 정찰 기 는 어떻게 처리 합 니까?두 가 지 를 물 려 받 을 수 없습니다!
그럼 우 리 는 계승 하지 않 아 도 되 지만 개발 팀 의 다른 사람들 이 정찰기 에 관련 되면 긴 코드 를 한 번 읽 어야 합 니까?클래스 의 모든 방법 에 대한 간략 한 설명 을 알 수 있 습 니까?
인터페이스 interface 를 사용 할 수 있 습 니 다.한 종 류 는 여러 개의 인 터 페 이 스 를 실행 할 수 있 습 니 다.인터페이스 에서 정 의 된 함 수 는 함수 체 가 있어 서 는 안 됩 니 다.인 터 페 이 스 를 실행 하 는 종 류 는 반드시 이 함수 들 을 완전 하 게 정의 해 야 합 니 다.
이렇게 해서 우 리 는 정찰기 가 비행 능력 인 터 페 이 스 를 실현 했다 는 것 을 알 고 있다.반드시 인터페이스 에서 묘사 한 비행 방법 이 있 을 것 이다./스텔스 능력 의 인터페이스

<?php 
  interface concealAbility
  {
    public function conceal();
  }
  //       
  interface flyAbility
  {
    public function fly();
  }
  //    
  class Wraith implements flyAbility, concealAbility
  {
    //                
    function fly()
    {
      //       
    }
    //                
    function conceal()
    {
      //       
    }
  }
?>

8.총화
우 리 는 PHP 가 대상 을 대상 으로 하 는 기본 지식 을 토론 했다.스타 크 래 프 트 라 는 전형 적 인 게임 을 통 해 대상 을 대상 으로 하 는 초보적인 역할 을 볼 수 있다.
우 리 는 대상 을 대상 으로 코드 를 더욱 선명 하 게 만 들 고 코드 를 조직 하여 비교적 편리 하 게 중복 사용 하 는 것 을 보 았 다.
또한 대상 도 변수의 충돌 을 줄 이 고 관련 데이터 의 저장 과 사용 을 편리 하 게 한다.
만약 에 해결 하고 자 하 는 문제 가 여러 가지 측면 과 관련된다 면 대상 을 대상 으로 더욱 유연 하고 기교가 있 는 방식,예 를 들 어 통상 적 으로 언급 한 디자인 모델 과 많은 구 조 를 진화 시 킬 수 있다.
물론 대상 을 대상 으로 하 는 단점 도 있 습 니 다.위의 코드 를 보면 먼저 코드 가 많 습 니 다.간단 한 임 무 는 여러 가지 유형 을 정의 하면 오히려 번 거 롭 습 니 다.
간단 한 작업 에 대해 서도 대상 을 대상 으로 코드 운행 의 효율 을 떨 어 뜨 릴 수 있다.
깊이 있 는 연 구 는 본문의 범 위 를 넘 어 섰 다.
더 많은 PHP 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 논문 에서 말 한 것 이 여러분 의 PHP 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기