PHP - 使用__get和$ this

时间:2015-11-13 11:47:14

标签: php magic-methods

通常如果我有一个对象$foo并且我想拦截对其中一个属性的访问,那么让我们说bar,当使用$foo->bar时,我可以使用魔术方法{ {1}}。

我可以看到(here__get__get交互时不起作用。我发现这种奇怪和不一致。

超出此行为的原因是什么?

1 个答案:

答案 0 :(得分:7)

仅当在对象上找不到具有给定名称的属性时,才会调用

__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"