45

我想在单个语句中为stdClass对象设置属性。我对此一无所知。我知道以下几点

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

它需要两个语句。

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

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

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

它不工作。

4

3 回答 3

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

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

于 2012-12-07T10:39:54.030 回答
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 对象。

于 2014-08-27T17:05:54.033 回答
4
        foreach ($attributes as $name => $value) {
            if (property_exists(self::class, $name)) {
                $this->{$name} = $value;
            }
        }

是最干净的,因为如果您 p​​rint_r(get_object_vars($obj)) 如果属性不存在,它将设置任意属性。

于 2017-10-16T18:23:12.293 回答