PHP - 使用 __get 和 $this
PHP - use __get with $this
通常如果我有一个对象 $foo
并且我想拦截对其之一 属性 的访问,比方说 bar
,当使用 $foo->bar
时,我可以使用魔法__get
.
据我所知 (here) __get
在与 $this
交互时不起作用。我觉得这种奇怪和不一致。
超出此行为的原因是什么?
__get()
仅当在对象上找不到具有给定名称的 属性 时才会调用。在您的示例中,$this->a
解析为受保护的 属性 $a
,可从 class 的上下文访问。这就是为什么在这种情况下不调用 __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"
通常如果我有一个对象 $foo
并且我想拦截对其之一 属性 的访问,比方说 bar
,当使用 $foo->bar
时,我可以使用魔法__get
.
据我所知 (here) __get
在与 $this
交互时不起作用。我觉得这种奇怪和不一致。
超出此行为的原因是什么?
__get()
仅当在对象上找不到具有给定名称的 属性 时才会调用。在您的示例中,$this->a
解析为受保护的 属性 $a
,可从 class 的上下文访问。这就是为什么在这种情况下不调用 __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"