这被认为是php offsetget方法中的一个错误

时间:2014-03-22 17:39:58

标签: php

示例,其中extends对象为implements ArrayAccess

如果我尝试以对象方式访问变量,则调用_getoffsetget,但 如果我访问它,只有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);

2 个答案:

答案 0 :(得分:2)

正如deceze所指出的,这不是PHP同时调用两种魔术方法,它们都在你的代码中明确调用:

  1. 您访问不存在的媒体资源,例如$app->foo
  2. 这将使用Application::__get
  3. 致电$key = 'foo'
  4. 其中包含行$this[$key],该行将解析为$this['foo']
  5. $this是一个以数组形式访问的对象,因此使用Container::offsetGet
  6. 调用$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()方法