3

有时我使用__getorstdClass数组转换为 object。但我不能决定我应该坚持下去。我想知道哪个更好更快,有什么想法吗?

class property 
{

    public function __get($name)
    {
        return (isset($this->$name)) ? $this->$name : null;
    }
}

$object = new property();
$object = new stdClass();

所以如果我使用new property(),我将有一个属性对象输出,

property Object
(
....
)

而如果我使用new stdClass(),我将有一个stdClass 对象输出,

stdClass Object
(
....
)

所以我可以像这样得到对象数据$item->title

编辑:

我如何进行实际的数组到对象的转换。

public function array_to_object($array = array(), $property_overloading = false)
    {

        # If $array is not an array, let's make it array with one value of former $array.
        if (!is_array($array)) return $array;

        # Use property overloading to handle inaccessible properties, if overloading is set to be true.
        # Else use std object.
        if($property_overloading === true) $object = new property();
            else $object = new stdClass();

        foreach($array as $key => $value)
        {
            $key = (string) $key ;
            $object->$key = is_array($value) ? self::array_to_object($value, $property_overloading) : $value;
        }

        return $object;
    }
4

2 回答 2

3

首先,像您这样的(几乎)空类定义几乎就像 anstdClass所以使用任何一个都不会出现任何重大问题。

也就是说,您的“命名”类所具有的一个优势stdClass是,您可以通过利用__get魔术方法来定义访问不存在的属性时会发生什么。

class property
{
   public function __get($name)
   {
       return null;
   }
}

以上是对原始property类的更简单重写;当__get()被调用时,你已经知道$this->$name没有设置。尽管这不会引起通知,但当您尝试引用不存在的$obj->bla->bla位置时,它并不能防止致命错误。$obj->bla

在访问不存在的属性时抛出异常可能更有用:

class property
{
   public function __get($name)
   {
       throw new Exception("Property $name is not defined");
   }
}

这允许您的代码在异常变成完全停止脚本的致命运行时错误之前捕获异常。

于 2012-11-14T09:28:12.503 回答
0

如果您只是将“属性”类用作哑数据容器,请使用 stdClass 甚至数组。

于 2012-11-14T01:27:24.353 回答