如何在创建对象时设置stdClass对象的属性

时间:2012-12-07 10:33:46

标签: php stdclass

我想在单个语句中设置 stdClass 对象的属性。 我对此一无所知。我知道以下事情

$obj = new stdClass;
$obj->attr = 'loremipsum';

需要两个陈述。

$obj = (object) array('attr'=>'loremipsum');

它需要单一陈述,但它不是直接方法。

$obj = new stdClass(array('attr'=>'loremipsum'));

它不起作用。

4 个答案:

答案 0 :(得分:57)

$obj = (object) array(
    'attr'=>'loremipsum'
);

实际上,这就像它会得到的一样直接。即使是自定义构造函数也无法在单个表达式中执行此操作。

(object)强制转换可能实际上是数组的简单转换,因为内部属性也存储在散列中。

你可以像这样创建一个基类:

abstract class MyObject
{
    public function __construct(array $attributes = array())
    {
        foreach ($attributes as $name => $value) {
            $this->{$name} = $value;
        }
    }
}

class MyWhatever extends MyObject
{
}

$x = new MyWhatever(array(
    'attr' => 'loremipsum',
));

这样做会锁定你的构造函数,要求每个类在被覆盖时调用它的父构造函数。

答案 1 :(得分:5)

虽然Ja͢ck给出了一个很好的答案,但重要的是要强调PHP解释器本身有一个描述how to properly represent an object or variable的方法:

php > $someObject = new stdClass();
php > $someObject->name = 'Ethan';
php > var_export($someObject);
stdClass::__set_state(array(
   'name' => 'Ethan',
))

有趣的是,使用stdClass::__set_state无法创建stdClass对象,因此显示它可能是a bug in var_export()但是,它的确表明没有直接的方法来创建stdClass对象,并在创建对象时设置属性。

答案 2 :(得分:1)

        foreach ($attributes as $name => $value) {
            if (property_exists(self::class, $name)) {
                $this->{$name} = $value;
            }
        }

是最干净的,因为如果属性不存在,则返回对象的print_r(get_object_vars($ obj))将设置任意属性。

答案 3 :(得分:0)

$obj = json_decode('{"attr":1,"B":[1,2]}');