Как вы копируете объект PHP в другой тип объекта

  • Новый класс является подклассом исходного объекта

  • Он должен быть совместим с php4

Ответ 1

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

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

Ответ 2

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

Тем не менее:

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

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

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

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

Ответ 4

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

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

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

Ответ 5

Я бы предположил, что вам придется изобретать своего рода "конструктор копирования". Затем вы просто создадите новый объект подкласса при передаче в исходном объекте.