2011-12-17 44 views
0

我正在使用__get__set方法進行變量重載。PHP重載 - 避免注意:試圖獲取非對象的屬性

在一些情況下,我將另一個目的分配給一個變量,例如:

$object->name->another = $another_object; 

$object,具有__get__set方法。當我嘗試訪問$object->name->another之前,它已經設置,我得到的錯誤

注意:試圖讓非對象

的財產有反正這周圍使用超載?而不必檢查變量上的isset。

謝謝!

+0

使用`isset`有什麼問題? – 2011-12-17 04:12:59

回答

1

$object$object->name需要有__get()/__set()超載,如果你想進行交互,以防止有問題的錯誤:

$object->name->another = 'something'; 
^^^^^^^^^^^^^ 

例如,你可以讓$object::__get()返回一個空stdClass對象,PHP會然後在這種情況下自動爲其分配一個公共成員。

0

只要確保您爲「名稱」返回重載的類。 PHP將獲取屬性,然後嘗試在生成的對象上設置第二個屬性。

<?php 
class Bob { 
    public function __get($name) { 
     return new Jim(); 
    } 
} 
class Jim extends Bob { 
    public function __get($name) { 
     return 12; 
    } 
} 

$b = new Bob(); 
echo $b->someJim->apples; 
2

雖然這不會回答你的問題,它解決了一個重要的方面:

值得一提的是,你不應該讓你的魔法__get__set方法,以提高該通知。 「最佳實踐」是拋出專門爲此設計的新(ish)SPL異常類型之一。例如:

public function __get($name) 
{  
    if (isset($this->vals[$name])) { 
    return $this->vals[$name]; 
    } else { 
    $msg = "Invalid property: '$name' does not exist"; 
    throw new OutOfBoundsException($msg); 
    } 
} 

而對於__set ...

public function __set($name, $val) 
{  
    if (isset($this->vals[$name])) { 
    $this->vals[$name] = $val; 
    } else { 
    $msg = "Invalid property: '$name' does not exist"; 
    throw new OutOfBoundsException($msg); 
    } 
} 

這裏有新的SPL異常類型的主題a link to a helpful article

+0

因此,您將使用$ object-> name ['another']而不是$ object-> name-> another? – dzm 2011-12-17 04:20:55

+0

不,這只是一個示例實現,您可以在您的類的受保護$ vals屬性中存儲和訪問您的魔法屬性。其他發佈的答案正確地評估你的問題:你分配給`$ object-> name`的實體應該是一個具有`$ another`屬性的實際對象 – rdlowrey 2011-12-17 04:23:50

相關問題