-1
通常如果我有一個對象$foo
並且我想攔截其某個屬性的訪問權限,比如說bar
,使用$foo->bar
時,我可以使用魔術方法__get
。
從我所看到的(here)__get
在與$this
的互動中不起作用。我覺得這種奇怪和不一致。
超出此行爲的原因是什麼?
通常如果我有一個對象$foo
並且我想攔截其某個屬性的訪問權限,比如說bar
,使用$foo->bar
時,我可以使用魔術方法__get
。
從我所看到的(here)__get
在與$this
的互動中不起作用。我覺得這種奇怪和不一致。
超出此行爲的原因是什麼?
__get()
只有在對象上找不到具有給定名稱的屬性時纔會被調用。在您的示例中,$this->a
解析爲可從類的上下文訪問的受保護屬性$a
。這就是爲什麼__get()
在這種情況下不會被調用。
這與使用$this
無關。
class A {
public $a = 'A'; // $a is public
public function __get($name) {
return 'B';
}
}
$a = new A();
var_dump($a->a); // string(1) "A" and not "B"
class B {
protected $b = 'B'; // $b is protected
public function __get($name) {
return 'C';
}
}
$b = new B();
var_dump($b->b); // string(1) "C" and not "B"
class C1 {
private $c = 'C';
}
class C2 extends C1 {
public function __get($name) {
return 'D';
}
}
$c = new C2();
var_dump($c->c); // string(1) "D" and not "C"
不清楚你在問什麼..... \ _ \ _ get()適用於__ can不能從調用範圍訪問___的屬性; '$ this-> a'可以從'$ this'內部訪問,所以它不會調用'__get()'....這並不矛盾 –
[PHP Docs ref](http:// php。 net/manual/en/language.oop5.overloading.php#object.get) - '__get()用於讀取__inaccessible屬性__中的數據。'(我強調) –