PHP copy all object properties to this

不打扰是莪最后的温柔 提交于 2020-04-07 14:46:27

问题


I have an object in PHP, of the type MyObject.

$myObject instanceof MyObject

Now, in the class MyObject, there is a non-static function, and in there, I use the reference to "me", like $this, but I also have another object there.

Is it possible, without doing $this = $myObject, to achieve more or less the same effect, like something of the sort set_object_vars($this, get_object_vars($myObject))?


回答1:


<?php

class MyObject
{
    public function import(MyObject $object)
    {   
        foreach (get_object_vars($object) as $key => $value) {
            $this->$key = $value;
        }
    }   
}

Will do what you want I guess, but you should be aware of the following:

  1. get_object_vars will only find non-static properties
  2. get_object_vars will only find accessible properties according to scope

The according to scope part is quite important and may deserve a little more explanation. Did you know that properties scope are class dependent rather than instance dependent in PHP?

It means that in the example above, if you had a private $bar property in MyObject, get_object_vars would see it, since you are in an instance of a MyObject class. This will obviously not work if you're trying to import instances of another class.




回答2:


@Geoffrey Bachelet we can improve this:

class MyObject
{
    //object or array as parameter
    public function import($object)
    {   
        $vars=is_object($object)?get_object_vars($object):$object;
        if(!is_array($vars)) throw Exception('no props to import into the object!');
        foreach ($vars as $key => $value) {
            $this->$key = $value;
        }
    }   
}

The difference is here that you can pass an ordinary array (hashtable) as well as an object. Think in example about some data coming from the database.



来源:https://stackoverflow.com/questions/8712791/php-copy-all-object-properties-to-this

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!