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

Php 如何在创建对象时为stdClass对象设置属性,php,stdclass,Php,Stdclass,我想在一条语句中设置stdClass对象的属性。 我对此一无所知。我知道以下事情 $obj = new stdClass; $obj->attr = 'loremipsum'; 这需要两种说法 $obj = (object) array('attr'=>'loremipsum'); 它接受单个语句,但不是直接方法 $obj = new stdClass(array('attr'=>'loremipsum')); 它不起作用 $obj = (object) array(

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

$obj = new stdClass;
$obj->attr = 'loremipsum';
这需要两种说法

$obj = (object) array('attr'=>'loremipsum');
它接受单个语句,但不是直接方法

$obj = new stdClass(array('attr'=>'loremipsum'));
它不起作用

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

这样做会锁定您的构造函数,要求每个类在重写时调用其父构造函数。

尽管Ja͢ck给出了一个很好的答案,但必须强调PHP解释器本身有一个描述以下内容的方法:

有趣的是,使用
stdClass::u set_state
无法创建stdClass对象,因此很可能会这样显示它但是,它确实说明了没有直接的方法来创建在对象创建时设置了属性的stdClass对象。

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

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

您不能使用
stdClass
执行此操作。您将需要创建自己的自定义类,该类具有构造函数。为什么要创建“MyWhatch”?您可以通过删除抽象关键字直接使用“MyObject”,对吗?当然,如果您对基类的实例满意,您可以删除抽象关键字:)很高兴知道。顺便问一下,您使用什么命令来获取php命令行解释器,如python解释器(键入、输入、查看输出)?来自Bash CLI:
php-a
:)谢谢(还有5个…)
        foreach ($attributes as $name => $value) {
            if (property_exists(self::class, $name)) {
                $this->{$name} = $value;
            }
        }