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

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

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

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

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

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

Тем не менее:

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

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

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

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

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

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

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

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

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