2011-11-17 69 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