php对象:属性对象与stdClass对象 - 哪个更好?

时间:2012-11-14 01:24:30

标签: php properties std

有时我会使用__getstdClass数组转换为对象。但我不能决定我应该坚持。我想知道哪一个更好更快,有什么想法?

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

2 个答案:

答案 0 :(得分:2)

首先,像你一样的(几乎)空类定义几乎就像stdClass所以使用任何一个都不会有任何重大问题。

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

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

以上是对原始property类的简单重写;在调用__get()时,您已经知道$this->$name未设置。虽然这不会引起通知,但当您尝试引用不存在$obj->bla->bla的{​​{1}}时,它不会阻止致命错误。

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

$obj->bla

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

答案 1 :(得分:0)

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