【问题标题】:Add properties to stdClass object from another object从另一个对象向 stdClass 对象添加属性
【发布时间】:2011-02-08 19:22:49
【问题描述】:

我希望能够做到以下几点:

$obj = new stdClass;
$obj->status = "success";

$obj2 = new stdClass;
$obj2->message = "OK";

如何扩展 $obj 使其包含 $obj2 的属性,例如:

$obj->status //"success"

$obj->message // "OK"

我知道我可以使用数组,将所有属性添加到数组中,然后将其转换回对象,但是有没有更优雅的方法,像这样:

扩展($obj, $obj2); //将$obj2的所有属性添加到$obj

谢谢!

【问题讨论】:

    标签: php object properties extend stdclass


    【解决方案1】:

    【讨论】:

      【解决方案2】:

      这更像是你不想这样做的方式......

      $extended = (object) array_merge((array)$obj, (array)$obj2);
      

      但是我认为这比必须遍历属性要好一些。

      【讨论】:

      • 毕竟,它似乎是最“优雅”的,即使它涉及到数组和返回的强制转换。顺便说一句,对象到数组的转换有多贵?它是否涉及循环遍历所有属性,然后将其作为键添加到数组中?
      【解决方案3】:

      您可以在 stdClass 对象之一上使用 get_object_vars(),遍历这些对象,然后将它们添加到另一个对象:

      function extend($obj, $obj2) {
          $vars = get_object_vars($obj2);
          foreach ($vars as $var => $value) {
              $obj->$var = $value;
          }
          return $obj;
      }
      

      请注意,不确定您是否会认为这样更优雅。

      编辑:如果您对将它们实际存储在同一个地方并不吝啬,请查看this answer to a very similar question

      【讨论】:

      • 一个有效的解决方案,但我想 cast-to-array-and-back 方法做同样的事情,除了它在 php 引擎内部完成,应该更快一些。
      • 当然。因此不确定这是否会被归类为“更优雅”。演员阵容可能很丑,但还不够丑。 :)
      【解决方案4】:

      如果对象是 stdClass 的实例(在你的情况下),你可以简单地扩展你的对象...

      $obj = new stdClass;
      $obj->status = "success";
      
      $obj2 = new stdClass;
      $obj2->message = "OK";
      
      $obj->message = $message;
      $obj->subject = $subject;
      

      ....和你想要的一样多。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多