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