【问题标题】:Global check for valid properties in a PHP stdClass?全局检查 PHP stdClass 中的有效属性?
【发布时间】:2011-12-31 10:29:44
【问题描述】:

是否可以检查 PHP stdClass 的属性?我有一些作为标准类生成的模型。使用它们时,我想检查我调用的属性是否存在于某种核心类中。我注意到 __get 被 stdClass 忽略...

如果 stdClass 中的属性存在于对象中,如何检查它们?

【问题讨论】:

  • 也许我不明白您所说的“_get 被 stdClass 忽略”是什么意思,但 __get()stdClass 中_未实现
  • 我不知道。感谢您清除它:)
  • 如果我理解你的cmets右下:你也可以实现__isset()

标签: php stdclass


【解决方案1】:

StdClass 对象只包含属性,不包含代码。所以你不能从它们“内部”编码任何东西。所以你需要解决这个“缺点”。根据生成这些类的原因,可以通过“重载”数据(例如,使用 Decorator)提供您正在寻找的功能:

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);

【讨论】:

  • 是的,这是一种模式。如果你在课堂上描述更多 stdClass 对象是在哪里以及如何创建的,在某些情况下甚至可以简化。
  • 这似乎是一个解决方案。谢谢!接受 + 1:)
【解决方案2】:

使用get_object_vars()遍历stdClass对象,然后使用property_exists()函数查看当前属性是否存在于父类中。

【讨论】:

  • 但是全局存储在哪里?因为 __get() 被忽略了..?
  • @BenFransen:您能否发布一个 stdClass 实例的转储,以及您所指的核心类。
  • stdClass 由 mysql_fetch_object() 生成。在一个名为 System_Core 的类中(每个类都从该类扩展)有魔术函数 __get() 和 __set()。
  • 装饰器模式是我正在寻找的。感谢您的帮助,+1 :)
【解决方案3】:

只需将其转换为数组

$x = (array) $myStdClassObject;

然后就可以使用所有常用的数组函数了

【讨论】:

  • 目标实际上是将数组作为对象;)
猜你喜欢
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-10
  • 2014-08-17
  • 1970-01-01
相关资源
最近更新 更多