2011-11-05 22 views
1

我跑了一個問題,我無法解釋我的代碼。我能想到的唯一的事情就是魔法方法在ArrayObjects中不起作用。例如,考慮下面的類:魔法方法在ArrayObjects中不起作用?

class foo extends ArrayObject { 

    public $bar = '@@@'; 

    public function __construct() { 
     parent::__construct(array(), ArrayObject::ARRAY_AS_PROPS); 
    } 

    public function __get($prop) { 
     return '@@@'; 
    } 
} 

以下行給我一個錯誤 「通知:未定義指數:測試...」

$foo = new foo(); 
echo $foo->test; 

然而,這些線路很好地工作:

$foo = new foo(); 
echo $foo->bar; 

我是瘋了還是這是一個已知的問題?

回答

3

你正在尋找的「神奇」功能被稱爲offsetGetDocs,不__get

class foo extends ArrayObject { 

    public $bar = '@@@'; 

    public function __construct() { 
     parent::__construct(array(), ArrayObject::ARRAY_AS_PROPS); 
    } 

    public function offsetGet($prop) 
    { 
     if (!parent::offsetExists($prop)) 
      return '@@@'; 
     return parent::offsetGet($prop); 
    } 
} 

$foo = new foo(); 
echo $foo->test; # @@@ 

我不知道這是肯定的,但作爲__get你從內部擴展不可用以某種方式阻止它的類。

+0

很有意思。所以我必須覆蓋部分ArrayAccess接口,而不是使用ArrayObjects的普通魔術方法。我將不得不嘗試一下。讓我覺得我應該實現一個ArrayAccess接口,而不是擴展ArrayObject。 – dqhendricks

+0

從ArrayObject正常擴展的好處是,你不需要輸入那麼多的東西,而已經擁有了你所需要的全部東西:) – hakre