Подтвердить что ты не робот

PHP копирует все свойства объекта в это

У меня есть объект в PHP, типа MyObject.

$myObject instanceof MyObject

Теперь в class MyObject существует нестатическая функция, и там я использую ссылку на "me", например $this, но у меня также есть другой объект.

Возможно ли, не делая $this = $myObject, достичь более или менее того же эффекта, например, что-то вроде set_object_vars($this, get_object_vars($myObject))?

4b9b3361

Ответ 1

<?php

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

Будет делать то, что вы хотите, я думаю, но вы должны знать следующее:

  • get_object_vars найдет только нестатические свойства
  • get_object_vars найдет доступные свойства в соответствии с областью

Часть в соответствии с областью очень важна и может заслуживать немного большего объяснения. Знаете ли вы, что область свойств зависит от класса, а не зависит от экземпляра в PHP?

Это означает, что в приведенном выше примере, если у вас есть свойство private $bar в MyObject, get_object_vars увидит его, так как вы находитесь в экземпляре класса MyObject. Очевидно, что это не сработает, если вы пытаетесь импортировать экземпляры другого класса.

Ответ 2

@Geoffrey Bachelet мы можем улучшить это:

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;
        }
    }   
}

Различие заключается в том, что вы можете передать обычный массив (хеш-таблицу), а также объект. Подумайте, например, о данных, поступающих из базы данных.