Как назначить предка типу потомка в PHP - приведение типа класса
Я пытаюсь присвоить предку (A) переменную типа Потомок (B) и вызвать метод потомка для предка в PHP, но не могу заставить его работать.
class B extends A{
public function c(){ echo 'B.c'}
}
Я пытался:
Переписывание
B
конструкторclass B extends A{ public function __construct($parent) { $this = $parent; } ... }
$this
не может быть переписан, так что нет.
Эта вещь, я забыл, как это называется
function d(B $b){ $b = new A(); b.c(); }
Явное приведение типов
function d(){ $b = (B) new A(); b.c(); }
Или же
function d(){ $b = settype(new A(),'B'); b.c() }
Это не работает ни как settype
допускаются только определенные типы, но не другие определяемые пользователем типы объектов.
1 ответ
Вся информация, которую я видел, говорит о том, что не существует чистого способа изменить тип объекта. (PHP просто подделывает определенные виды приведения, например, есть (int)
оператор но типа int
сам по себе неизвестен.)
Подходы, которые я нашел, бывают двух типов:
Сериализуйте ваш объект, взломайте строку, чтобы изменить ее тип, десериализуйте. (Смотрите здесь или здесь- эквивалент). Или же
Создайте новый объект и скопируйте все его свойства. (См. Здесь)
Я бы выбрал второй подход, поскольку вы, похоже, имеете дело с известной иерархией объектов:
class B extends A {
public function __construct(A $object) {
foreach($object as $property => $value) {
$this->$property = $value;
}
}
}
Если у вас есть некоторый контроль над созданием исходного объекта, рассмотрите возможность реализации фабричного шаблона, чтобы ваш объект создавался с типом B
с самого начала.