示例,其中extends
对象为implements ArrayAccess
如果我尝试以对象方式访问变量,则调用_get
和offsetget
,但
如果我访问它,只有offsetget
被称为
我似乎没有问题(我从_get返回的值,如果有的话) ,但是抵消方法可能会使事情变得混乱
任何人都有这方面的经历
class Container implements ArrayAccess {
public function offsetGet($key)
{
$this->t .= "call magic offsetGet with $key<br>";
return $this->make($key);
}
}
class Application extends Container{
protected $t="";
public function __get($key)
{
$this->t .= "call magic _get with $key<br>";
return $this[$key];
}
}
$e = $app->t;
// $e = $app['b'];
// echo $app->t;
var_dump($e);
答案 0 :(得分:2)
正如deceze
所指出的,这不是PHP同时调用两种魔术方法,它们都在你的代码中明确调用:
$app->foo
Application::__get
$key = 'foo'
$this[$key]
,该行将解析为$this['foo']
$this
是一个以数组形式访问的对象,因此使用Container::offsetGet
$key='foo'
醇>
如果您只是直接访问$app['foo']
,则永远不会调用Application::__get
,因为您将直接跳到第4步。
同样,如果您在return $this[$key]
中注释掉Application::__get
行,则不会调用Container::offsetGet
,因为这是调用ArrayAccess
魔法的行
答案 1 :(得分:0)
如手册所述:
__get() is utilized for reading data from inaccessible properties.
发出以下内容将创建名为“b”的公共属性:
$app->b ="hh";
从现在开始,如果您访问$ app-&gt; b,则不再调用__get()方法