我正在使用__get
和__set
方法進行變量重載。PHP重載 - 避免注意:試圖獲取非對象的屬性
在一些情況下,我將另一個目的分配給一個變量,例如:
$object->name->another = $another_object;
$object
,具有__get
和__set
方法。當我嘗試訪問$object->name->another
之前,它已經設置,我得到的錯誤
注意:試圖讓非對象
的財產有反正這周圍使用超載?而不必檢查變量上的isset。
謝謝!
我正在使用__get
和__set
方法進行變量重載。PHP重載 - 避免注意:試圖獲取非對象的屬性
在一些情況下,我將另一個目的分配給一個變量,例如:
$object->name->another = $another_object;
$object
,具有__get
和__set
方法。當我嘗試訪問$object->name->another
之前,它已經設置,我得到的錯誤
注意:試圖讓非對象
的財產有反正這周圍使用超載?而不必檢查變量上的isset。
謝謝!
不$object
但$object->name
需要有__get()
/__set()
超載,如果你想進行交互,以防止有問題的錯誤:
$object->name->another = 'something';
^^^^^^^^^^^^^
例如,你可以讓$object::__get()
返回一個空stdClass
對象,PHP會然後在這種情況下自動爲其分配一個公共成員。
只要確保您爲「名稱」返回重載的類。 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;
雖然這不會回答你的問題,它解決了一個重要的方面:
值得一提的是,你不應該讓你的魔法__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。
使用`isset`有什麼問題? – 2011-12-17 04:12:59