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

问题描述 投票:0回答:4

我想在单个语句中为 stdClass 对象设置属性。 我对此没有任何想法。我知道以下几件事

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

需要两个陈述。

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

它需要单个语句,但不是直接方法。

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

它不起作用。

php stdclass
4个回答
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',
));

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


7
投票

虽然 Ja͢ck 给出了一个很好的答案,但重要的是要强调 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 对象。


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

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


0
投票
您可以创建一个匿名类,如下所示,而不是 stdClass。

$obj = new readonly class(123, 'example') { public function __construct( public int $foo, public string $bar, ) {} };
    
© www.soinside.com 2019 - 2024. All rights reserved.