Я пытаюсь назначить предка (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
разрешены только определенные типы, но не другие определенные пользователем типы объектов.
Все Информация Я видели предполагает, что не существует чистого способа изменить тип объекта. (PHP просто подделывает определенные виды приведения, например, есть (int)
оператор но типа int
сам по себе неизвестен.)
Подходы, которые я нашел, бывают двух типов:
Сериализуйте ваш объект, взломайте строку, чтобы изменить ее тип, десериализуйте. (Увидеть Вот или же Вот— эквивалент). Или же
Создайте новый объект и скопируйте все его свойства. (Увидеть Вот)
Я бы выбрал второй подход, поскольку вы, похоже, имеете дело с известной иерархией объектов:
class B extends A {
public function __construct(A $object) {
foreach($object as $property => $value) {
$this->$property = $value;
}
}
}
Если вы имеете некоторый контроль над созданием исходного объекта, рассмотрите возможность реализации фабричного шаблона, чтобы ваш объект создавался с типом B
с самого начала.
Других решений пока нет …