Как вы копируете объект PHP в другой тип объекта - PullRequest
8 голосов
/ 23 сентября 2008
  1. Новый класс является подклассом исходного объекта

  2. Требуется совместимость с php4

Ответы [ 5 ]

6 голосов
/ 23 сентября 2008

Ваши классы могут быть пустыми, а затем загружаться любым количеством методов. Один из этих методов может принять экземпляр родительского класса в качестве аргумента, а затем скопировать его данные оттуда

class childClass extends parentClass
{
    function childClass()
    {
        //do nothing
    }

    function loadFromParentObj( $parentObj )
    {
        $this->a = $parentObj->a;
        $this->b = $parentObj->b;
        $this->c = $parentObj->c;
    }
};

$myParent = new parentClass();
$myChild = new childClass();
$myChild->loadFromParentObj( $myParent );
5 голосов
/ 23 сентября 2008

Вы можете сделать это с помощью некоторой черной магии, хотя я бы серьезно спросил , почему у вас есть это требование в первую очередь. Это говорит о том, что с вашим дизайном что-то не так.

Тем не менее:

function change_class($object, $new_class) {
  preg_match('~^O:[0-9]+:"[^"]+":(.+)$~', serialize($object), $matches);
  return unserialize(sprintf('O:%s:"%s":%s', strlen($new_class), $new_class, $matches[1]));
}

Это подчиняется тем же ограничениям, что и сериализация в целом, что означает, что ссылки на другие объекты или ресурсы теряются.

3 голосов
/ 23 сентября 2008

Объект php не сильно отличается от массива, и, поскольку все переменные объекта PHP 4 являются открытыми, вы можете делать некоторые беспорядочные вещи, например:

function clone($object, $class)
{
     $new = new $class();
     foreach ($object as $key => $value)
     {
          $new->$key = $value;
     }
     return $new;
}
$mySubclassObject = clone($myObject, 'mySubclass');

Это не красиво, и, конечно, это не то, что я считаю хорошей практикой, но это многоразового использования, и это довольно аккуратно.

2 голосов
/ 23 сентября 2008

Лучшим методом было бы создать метод клонирования в подклассе, чтобы вы могли сделать:

$myvar = $subclass->clone($originalObject)

В качестве альтернативы это звучит так, как будто вы можете посмотреть на шаблон декоратора Пример php

1 голос
/ 23 сентября 2008

Я бы подумал, что вам придется изобрести своего рода «конструктор копирования». Тогда вы просто создадите новый объект подкласса, одновременно передавая исходный объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...