2012-10-17 5 views
2

에서 부모 클래스의 자식 메서드를 호출? 내가 다음과 같은 오류 준 코드를 실행했을 때는 다음 클래스 계층 구조를 갖는 PHP

문제는 다음과 같습니다 $thisparse()에서 호출하지 말아야 TheParent에서 TheChild 상속 때문에

Fatal error: Call to private method TheChild::validate() from context 'TheParent' on line 4 

$child의 인스턴스를 참조 할 수 있으므로 validate()가 표시됩니다 ~ parse()?

참고 :
나는 완전히이에서 작업하는 이유를 이해하지 않지만이 문제에 대한 해결책은, PHP 매뉴얼에 this comment에 따라 validate() 기능 protected을 만들 것 중 하나를 발견 어떤 연구를하고 후 케이스.

제 2 용액은 상위에서 abstract protected 방법 validate()을 만들고 아이 protected 방법은 상위에서 액세스 할 수있는 제 용액 (중복되는) 하위에 재정의한다?!

누군가이 경우 상속이 어떻게 작동하는지 설명해 주실 수 있습니까?

답변

3

상속에 대한 귀하의 아이디어는 정확하며 가시성이 아닙니다.

Protected는 클래스 및 상속 된 클래스와 부모 클래스에서 사용할 수 있으며 private은 정의 된 실제 클래스에서만 사용할 수 있습니다.

+0

hmmm 내 코드에서'$ child-> parse()'를 호출하면 부모 클래스에서'parse' 함수를 실행하고 그 안에'$ this'가 자식이 아닌 부모 클래스 인스턴스를 참조 할 것입니까? – Songo

+0

인스턴스는 하나이지만 인스턴스의 관점에서 볼 수 있습니다. 부모 클래스의 개인 메소드는 단순히 호출 할 수 없습니다. 이것은'private','protected'와'public'의 정확한 목적과 차이점입니다. – Evert

2

개인은 부모 클래스 나 하위 클래스를 정의하지 않는 클래스에서만 액세스 할 수 있습니다.

사용하는 대신 보호 :

class TheParent{ 

    public function parse(){ 
     $this->validate(); 
    } 

} 

class TheChild extends TheParent{ 

    protected function validate(){ 
     echo 'Valid!!'; 
    } 
} 

$child= new TheChild(); 
$child->parse(); 
0

Visibility from other objects

Objects of the same type will have access to each others private and protected members even though they are not the same instances. This is because the implementation specific details are already known when inside those objects.

개인 만 class which defines 또는 Same object type 예에 액세스 할 수

class TheChild { 
    public function parse(TheChild $new) { 
     $this->validate(); 
     $new->validate(); // <------------ Calling Private Method of $new 
    } 
    private function validate() { 
     echo 'Valid!!'; 
    } 
} 

$child = new TheChild(); 
$child->parse(new TheChild()); 

출력

,691 PHP의 DOC로부터

유효 !! 유효 !!

14

다른 포스터는 이미 mehod가 액세스 할 수 있도록 보호되어야한다고 지적했습니다.

코드에서 한 가지 더 변경해야한다고 생각합니다. 기본 클래스 parent은 하위 클래스에 정의 된 메서드를 사용합니다. 그것은 나쁜 프로그래밍입니다.다음과 같이 코드를 변경합니다

abstract class TheParent{ 

    public function parse(){ 
     $this->validate(); 
    } 

    abstract function validate(); 

} 

class TheChild extends TheParent{ 

    protected function validate(){ 
     echo 'Valid!!'; 
    } 
} 

$child= new TheChild(); 
$child->parse(); 

는 추상 함수를 만드는 것은 추상 클래스 의 모든 추상적 인 기능은 이러한 클래스

에서 상속에 대한을 구현해야하기 때문에 자식 클래스가 확실히 함수 validate있을 것이라는 점을 보장합니다
+0

불쌍한 사람들이 OOP를 실제로 이해하고있는 사람은 이처럼 간과됩니다. 나는 추상 함수 응답을 부여했을 것이다. – pythonian29033

+1

이것은 정답이다. 자식 클래스에 메서드를 구현하고 손가락을 교차 시켜서 항상 그렇게할만한 것은 아닙니다. 아이가 반드시 메서드를 정의해야한다는 것을 보장하는 것은 갈 길이 멀다. –

관련 문제