如何在当时创建对象设置stdClass的对象属性(How to set attributes for

2019-08-03 16:29发布

我想在单个语句stdClass的对象设置属性。 我没有任何想法。 我知道下面的东西

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

它有两个语句。

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

这需要单独的语句,但它不是直接的方法。

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

这是行不通的。

Answer 1:

$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',
));

这样做虽然会锁定你的构造,要求每个类中重写时调用它的父类的构造。



Answer 2:

虽然杰克给出了很好的答案,它强调的是,PHP解释器本身具有用于描述方法是很重要的如何正确地代表一个对象或变量 :

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

有趣的是,使用stdClass::__set_state无法创建stdClass的对象,从而显示它是这样很可能在一个错误var_export() 然而,它确实表明有是创建具有设置为对象创建的时间属性stdClass的对象没有直接的方法。



Answer 3:

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

是干净的,因为如果你的print_r返回对象的(get_object_vars($ OBJ)),如果属性不存在,它会设置的任意属性。



Answer 4:

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


文章来源: How to set attributes for stdClass object at the time object creation
标签: php stdclass