2013-04-13 6 views
0

현재 클래스뿐만 아니라 현재 클래스를 확장하는 모든 클래스에서만 사용할 수 있도록하려면 "보호 된"메서드를 만들어야한다는 것을 알고 있습니다.부모 클래스에서 보호 된 메서드에 액세스

좋아요, grandChildClass :: method2()는 자식에서 확장되므로 보호해야합니다.

하지만 parentClass :: method2()와 같은 부모 클래스에서 액세스하는 경우 어떻게해야합니까?

class parentClass 
{ 
    public function method1() {$this->method2();} 
} 

class childClass extends parentClass 
{ 
    protected function method2() {} 
} 

class grandChildClass extends childClass 
{ 
    public function method3() {$this->method2();} 
} 

답변

2

당신이

$p = new parentClass; 
$p->method1(); 

하려고하면 당신은 정의되지 않은 메서드에 대한 치명적인 오류를 얻을 것입니다.

Fatal error: Call to undefined method parentClass::method2() in ... on line ...

그러나 이것은 잘 작동합니다 :

$c = new childClass; 
$c->method1(); 

$g = new grandChildClass; 
$g->method1(); 
$g->method3(); 

이들 모두를 childClass에 정의 된 method2를 호출합니다.

+0

이 클리너를 만들기 위해'parentClass'는'method2'의 순수 가상 버전을'virtual method2() = 0;'처럼 정의 할 수 있습니다. 이것은 명시 적으로 childClass가'parentClass' 메소드를 호출 할 수 있도록'method2()'함수를 구현할 것을 요구합니다. – Alan

+0

감사합니다. 나는 당신이 진술 한대로 작동하기를 바랬습니다! 나는 혼란스러워했고, 부모 클래스에서 정의 된 메서드에 액세스하고 있었지만, 손자 클래스 내에서 정의 된 메서드에 액세스하고있었습니다. 따라서 childClass 메서드가 제대로 작동했습니다. – user1032531

+0

@Alan : PHP에는'virtual' 메서드가 없습니다. 클래스와 그 메소드를 '추상적'으로 정의 할 수 있습니다 (이는 단지 정의 만하고 인스턴스화 할 수 없음을 의미합니다). –

관련 문제