2012-06-28 2 views
58

처음에는 두 메소드가 모두 생성자 작업을 호출하는 이유를 혼란스러워했지만 지금은 이해할 수 있다고 생각합니다. 확장 클래스는 부모 클래스의 메소드를 클래스 자체에서 선언 된 것처럼 상속하고 메소드는 부모 클래스에 있으므로 둘 다 작동해야합니다. 가있는 경우 이러한 동일한 코드를 실행 진정으로 동일한 방법으로, 또는 여부가 선호하는 방법 (parent 또는 this 통해) 메소드를 호출 (즉, 가장 좋은 방법), 그리고 경우 부모 메소드를 PHP로 호출하는 여러 가지 방법

지금 궁금하네요 다른 하나를 사용할 때주의해야합니다.

미안하지만, 나는 이것을 생각하고있을 것입니다. 내가 질문을 오해하고하지 않는 한 (이 경우 개)에 서브 클래스가 그 방법을 덮어 쓸 수 있기 때문에 그것을 확장 않기 때문에

abstract class Animal { 

    function get_species() { 

     echo "test"; 

    } 

} 

class Dog extends Animal { 

    function __construct(){ 

     $this->get_species(); 
     parent::get_species(); 

    } 

} 

$spike = new Dog; 

답변

77

부모 클래스의 메소드 종료 위치를 서브 클래스에서 메소드를 호출 할 세 가지 시나리오 (내가 생각할 수 있음)가 있습니다

  1. 방법이 서브 클래스에 의해 덮어 쓰기되지는 단지 존재가 부모의.

    이것은 예제와 동일하며 일반적으로 $this -> get_species();을 사용하는 것이 더 좋습니다.이 경우 2 개는 사실은 동일하지만 메소드는 하위 클래스에 상속되어 있으므로 구분할 필요가 없습니다. . $this을 사용하면 상속 된 메서드와 로컬로 선언 된 메서드간에 일관성을 유지할 수 있습니다.

  2. 방법은 서브 클래스에 의해 덮어 부모로부터 완전히 고유 한 논리를 가지고있다. 이 경우

    , 당신은 분명히 당신이 실행하는 방법의 부모의 버전을 원하지 않기 때문에 $this -> get_species();을 사용할 것입니다. 다시 말하지만, 지속적으로 $this을 사용하면이 사례와 첫 번째 사례 간의 구별에 대해 걱정할 필요가 없습니다.

  3. 방법은 부모 방법 달성 것과에 추가 상위 클래스를 확장한다. 이 경우

    , 당신은 여전히 ​​서브 클래스의 다른 방법에서 메서드를 호출 할 때 `$this -> get_species();를 사용하고 싶습니다. 부모 메서드를 호출하는 한 곳은 부모 메서드를 덮어 쓰는 메서드에서 온 것입니다. 예 : 당신이 될 것 최우선 방법의 바로 바깥 부모 메서드를 호출 할 필요가 어디 두 개의 서로 다른 일을 한 경우에

    abstract class Animal { 
    
        function get_species() { 
    
         echo "I am an animal."; 
    
        } 
    
    } 
    
    class Dog extends Animal { 
    
        function __construct(){ 
    
         $this->get_species(); 
        } 
    
        function get_species(){ 
    
         parent::get_species(); 
         echo "More specifically, I am a dog."; 
        } 
    } 
    

유일한 시나리오 내가 상상할 수있는 당신은 당신이의 부모의 버전을 알고있었습니다 방법이 아니라 지역.이 경우 안하지만, 그 자체를 제시 한 경우에,이 접근 할 수있는 깨끗한 방법은이하는 모든 호출 부모 방법입니다 get_parentSpecies() 같은 이름을 가진 새로운 방법을 생성하는 것입니다 :

function get_parentSpecies(){ 

    parent::get_species(); 
} 

다시 말하지만, 이는 모든 것을 훌륭하게 유지하고 부모 메소드에 의존하기보다는 로컬 메소드를 변경/수정할 수있게합니다.

+0

"확장"하지 않고 어떻게합니까? 클래스 "인간"안에 몇 가지 클레아 "다리"가 있지만 부모의 "인간"기능이 필요 없기 때문에 실제로 확장 할 필요는 없습니다. 이제'human ='$ leg = new leg()'를 만들었다면, 어떻게 leg 인스턴스'$ leg' 내부에서 인간의 함수를 호출 할 수 있을까요? – user151496

+0

@ user151496 다리는 인간의 하위 클래스가 아닙니다. 인간은 다리가 많지만 다리는 인간이 아닙니다. 그러므로 다리는 인간이 아니기 때문에 인간에게서 상속받은 다리의 종류는 없어야합니다. – Beetle

+0

Leg를 Leggy 인터페이스를 가진 클래스로 만들겠습니까? 아니면 인간 클래스가 Leggy를 구현하도록할까요? 다리가 인간에게만 독점적이지 않다는 것을 어떻게 정의 할 수 있습니까? 인간의 다리는 사람의 독창적 인 속성이며 인간의 일반적인 재산입니다. – Anthony

5

, 나는 거의 항상> get_species $ this-을 사용합니다. 클래스 dog가 메소드를 재정의하지 않으면 두 방법 모두 기능적으로 동일하지만 미래의 어떤 시점에서 개의 get_species 메소드가 "dog"를 인쇄해야한다고 결정하면 모든 코드를 거쳐야합니다. 그것을 바꿔라.

$ this를 사용하면 실제로 만든 개체의 일부이므로 사용중인 속성이 개체의 수명 동안 어떻게 든 변경된 경우 항상 최신 상태가됩니다. 반면 부모 클래스를 사용하면 정적 클래스 메서드가 호출됩니다.

+0

그 방법을 재정의하려는 경우를 대비하여 $ this를 사용하는 것이 좋습니다. 고마워요 – jerry

관련 문제