2011-11-17 26 views
2

是否可以從PHP stdClass中檢查屬性?我有一些正在生成stdClass的模型。當使用它們時,我想檢查我調用的屬性是否存在於某種Core類中。我注意到__get被stdClass忽略...全局檢查PHP stdClass中的有效屬性?

如果stdClass中的屬性存在於對象中,如何檢查其屬性?

+1

也許我不明白你的意思與「__get由stdClass的忽略」,但'__get()'是在'stdClass' _not implemented_。 – KingCrunch

+0

我不知道。感謝您清理:) – Ben

+0

如果我理解您的意見如下:您也可以實現'__isset()' – KingCrunch

回答

6

StdClass對象只包含porperties,不包含代碼。所以你不能從「內部」編寫任何代碼。所以你需要解決這個「短缺」問題。根據由什麼產生這些類可以做到這一點「超載」的數據(例如用裝飾)提供的功能,你在尋找:

class MyClass 
{ 
    private $subject; 
    public function __construct(object $stdClass) 
    { 
     $this->subject = $stdClass; 
    } 
    public function __get($name) 
    { 
     $exists = isset($this->subject->$name); 
     #... 
    } 
} 

$myModel = new MyClass($model); 
+1

目前正在檢查Decorator'pattern?',謝謝! – Ben

+0

是的,這是一種模式。如果您在課堂上描述更多的地方以及如何創建這些'stdClass'對象,那麼在某些情況下甚至可以簡化這些對象。 – hakre

+0

這看起來像一個解決方案。謝謝!接受+ 1 :) – Ben

5

使用get_object_vars()遍歷stdClass對象,然後使用property_exists()函數查看父類中是否存在當前屬性。

+0

但是在哪裏存儲全球?因爲__get()被忽略..? – Ben

+0

@BenFransen:你可以發佈一個stdClass實例的轉儲,以及你指的Core-class。 –

+0

stdClass由mysql_fetch_object()生成。在一個名爲System_Core的類中(每個類都從其擴展),有一些魔術函數__get()和__set()。 – Ben

0

只需將其轉換爲一個數組

$x = (array) $myStdClassObject; 

然後你可以使用所有常見的數組函數

+1

目標實際上是將數組作爲對象;) – Ben