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

Hab*_*wad 39 php stdclass

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

$obj = new stdClass;
$obj->attr = 'loremipsum';
Run Code Online (Sandbox Code Playgroud)

它需要两个陈述.

$obj = (object) array('attr'=>'loremipsum');
Run Code Online (Sandbox Code Playgroud)

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

$obj = new stdClass(array('attr'=>'loremipsum'));
Run Code Online (Sandbox Code Playgroud)

它不起作用.

Ja͢*_*͢ck 58

$obj = (object) array(
    'attr'=>'loremipsum'
);
Run Code Online (Sandbox Code Playgroud)

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

(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',
));
Run Code Online (Sandbox Code Playgroud)

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


dot*_*hen 6

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

php > $someObject = new stdClass();
php > $someObject->name = 'Ethan';
php > var_export($someObject);
stdClass::__set_state(array(
   'name' => 'Ethan',
))
Run Code Online (Sandbox Code Playgroud)

有趣的是,使用stdClass::__set_state无法创建一个stdClass对象,因此显示它可能是一个错误var_export().但是,它确实说明没有直接的方法来创建stdClass对象,并在创建对象时设置属性.