PHP скопировать все свойства объекта к этому - PullRequest
16 голосов
/ 03 января 2012

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

$myObject instanceof MyObject

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

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

Ответы [ 2 ]

49 голосов
/ 03 января 2012
<?php

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

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

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

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

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

0 голосов
/ 31 октября 2015

@ Джеффри Бачелет, мы можем улучшить это:

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

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

...