Новый класс является подклассом исходного объекта
Он должен быть совместим с 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
Я бы предположил, что вам придется изобретать какой-то «конструктор копирования». Затем вы просто создадите новый объект подкласса при передаче в исходном объекте.