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

Posted

技术标签:

【中文标题】如何在创建对象时为 stdClass 对象设置属性【英文标题】:How to set attributes for stdClass object at the time object creation 【发布时间】:2012-11-25 12:40:16 【问题描述】:

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

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

需要两个语句。

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

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

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

它不工作。

【问题讨论】:

您无法使用stdClass 执行此操作。您将需要创建自己的具有构造函数的自定义类。 【参考方案1】:
$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”?去掉abstract关键字就可以直接使用“MyObject”了吧? 当然,如果您对基类的实例感到满意,您可以删除抽象关键字:)【参考方案2】:

虽然 Ja͢ck 给出了很好的答案,但需要强调的是 php 解释器本身有一个描述 how to properly represent an object or variable 的方法:

php > $someObject = new stdClass();
php > $someObject->name = 'Ethan';
php > var_export($someObject);
stdClass::__set_state(array(
   'name' => 'Ethan',
))

有趣的是,使用stdClass::__set_state 无法创建stdClass 对象,因此显示它很可能是a bug in var_export()但是,它确实说明没有直接的方法来创建具有在对象创建时设置的属性的 stdClass 对象。

【讨论】:

很高兴知道。顺便说一句,你用什么命令来获取像 python 解释器这样的 php 命令行解释器(输入、输入、查看输出)? 来自 Bash CLI:php -a :) 谢谢(还有 5 个……)【参考方案3】:
        foreach ($attributes as $name => $value) 
            if (property_exists(self::class, $name)) 
                $this->$name = $value;
            
        

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

【讨论】:

以上是关于如何在创建对象时为 stdClass 对象设置属性的主要内容,如果未能解决你的问题,请参考以下文章

如何访问数组的对象(stdClass Object)成员/元素的属性? [复制]

[单选题]stdClass的一个对象如何设置成员value的值?

PHP new StdClass() 创建空对象

在数据结构中添加stdClass对象

如何在特定键值对之后访问 stdclass 对象?

如何附加一个 stdClass 对象