2015-01-14 5 views
-1

내 프로젝트에서 나는 많이 상속을 사용하고 있습니다. 이제 기본 클래스의 변수에 액세스하려고 할 때 마술 게터가 트리거되지 않음을 알았습니다. 따라서 다음 코드 : 재산 존재하지 않는 경우PHP 마술 __get 추상 기본 클래스에서 변수에 대해 작동하지 않습니다

abstract class A 
{ 
    protected $varA; 

    final public function __get($var) 
    { 
     echo $var; 
    } 
} 

class B extends A 
{ 
    protected $varB; 
} 

class C extends A 
{ 
    public function test() 
    { 
     $test = new B(); 
     $test->varB; // Get output 
     $test->varA; // No output 
    } 
} 

$test = new C(); 
$test->test(); 
+2

나를 위해 잘 작동 : http://3v4l.org/Je7dN – sectus

+0

이상한, 여기 내 로컬 컴퓨터에서 (내가 파생 된 코드를 심지어 온라인으로) 작동하지 않습니다. PHP 업데이트 (현재 5.6.2, 아마도 5.6.4에서 작동 가능) 시간. – Blaatpraat

+0

3v4l이 버전 5.6.2를 확인했습니다. 이 코드가 로컬 시스템에서 실행중인 코드입니까? – sectus

답변

4

이제 PHP 기능에 직면 한 것을 볼 수 있습니다. 속성의 가시성은 클래스에 의존하지만 객체에는 의존하지 않습니다.

같은 유형의 개체는 동일한 인스턴스가 아니더라도 서로 개인 및 보호 된 멤버에 액세스 할 수 있습니다. 구현 세부 정보는 이미 해당 개체에 일 때 알려지기 때문에 입니다.

http://php.net/manual/en/language.oop5.visibility.php#example-208

+0

Ok ... PHP의 OO 구현에 결함이 있습니다 ... 이것은 프로젝트 설계를 재고 할 필요가 있음을 의미합니다. – Blaatpraat

+0

@Blaatpraat, 당신은 결코 (PHP로) 확신 할 수 있습니다 : 그 기능이나 잘못입니다. %) – sectus

+0

이것은 실제로 발생하는 것이 아닙니다. 보호 된 변수는 오브젝트 외부에서 볼 수 있습니다. 그것은 단순히 접근 할 수 없다. 보호 된 변수에 액세스하려고 시도하면 치명적인 오류가 발생합니다. 반면에 private 변수는 클래스 외부에서 볼 수 없으며 undefined를 반환합니다. docs에 명시된대로 : http://php.net/manual/en/language.oop5.visibility.php – Pinoniq

0

__get에만 트리거됩니다.

varA는 귀하의 개체입니다. 문제는 그것이 보호된다는 것입니다. 따라서 수업 외부에서 접근 할 수는 없습니다.

+0

PHP 문서에 따르면 "__get()은 접근 할 수없는 속성에서 데이터를 읽는 데 사용됩니다." 이 범위에서 액세스 할 수 없습니다 ... – Blaatpraat

+0

'$ varA'는 C에서 액세스 할 수 없다고 말하는 @Blaatpraat는 무엇입니까? 그것은'private'이 아니라'protected'입니다. – Cthulhu

+0

@Cthulhu :이 답변은 코드 업데이트 전입니다. 그 옆에 : 그것은 여전히 ​​어쩔 수없는 것이어야합니다. 클래스 인스턴스 외부의 변수에 액세스하려고합니다. 개인적인 경우 B 또는 C도 액세스 할 수 없습니다. – Blaatpraat

0

CHILD부터 보호 된 var을 사용할 수 있습니다. 하위 클래스는 varA를 참조하십시오. 그러나 varA는 null입니다.

0

$ VARA는 클래스 A.

클래스 B의 보호 변수 & C는

그래서 $ VARA는 C 또는 B의 인스턴스에 존재하는 클래스 A의 확장입니다 왜냐하면 보호 된 변수는 그들이 정의 된 클래스의 자식에서 액세스 가능하고 할당 가능하기 때문입니다.

$ varA가 있으므로 __get이 트리거되지 않습니다.

나는 당신이 어떻게 달라질 것이라고 생각합니까?

+0

$ varA는 실제로 존재합니다. 그러나 클래스 C의 인스턴스에서 나는 클래스 B의 보호 된 변수를 볼 수 있다고 기대하지 않습니다. – Blaatpraat

+0

아, 지금 당신이 의미하는 것을 봅니다. 그것은 실제로 PHP에 대한 이상한 구현 선택입니다. – Erik