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

48

我想在一条语句中为一个stdClass对象设置属性,但我不知道如何实现。我知道以下几点:

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

需要两个语句。

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

它只需要一句话,但不是直接的方法。

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

它不起作用。


2
你不能使用 stdClass 来完成这个任务。你需要创建一个自定义类,并且该类必须有一个构造函数。 - deceze
3个回答

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

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


为什么要创建"MyWhatever"?你可以通过移除抽象关键字直接使用"MyObject",对吧? - Mohammed H
当然,如果您不介意拥有基类的实例,您可以删除抽象关键字 :) - Ja͢ck

7

尽管Ja͢ck给出了一个很好的答案,但重要的是要强调PHP解释器本身有一种方法来描述如何正确表示对象或变量:var_export()

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对象。


知道就好。顺便问一下,你用了什么命令来获取像Python解释器一样的PHP命令行解释器(输入、回车、查看输出)? - Mohammed H
1
从Bash CLI:php -a - dotancohen
:) Thanks (5 more to go...) - Mohammed H

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

因为在返回的对象中,如果属性不存在,它将设置任意属性,所以它是最干净的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接