наследование — Как назначить предка типу потомка при приведении типа класса

Я пытаюсь назначить предка (A) для переменной типа Потомок (B) и вызвать метод потомка для предка в PHP, но не могу заставить его работать.

class B extends A{
public function c(){ echo 'B.c'}
}

Я пытался:

  1. Переписывание B конструктор

    class B extends A{
    public function __construct($parent)
    {
    $this = $parent;
    }
    ...
    }
    

$this не может быть переписан, так что нет.

  1. Эта вещь, я забыл, как это называется

    function d(B $b){
    $b = new A();
    b.c();
    }
    
  2. Явное приведение типов

    function d(){
    $b = (B) new A();
    b.c();
    }
    

    Или же

    function d(){
    $b = settype(new A(),'B');
    b.c()
    }
    

Это не работает как settype разрешены только определенные типы, но не другие определенные пользователем типы объектов.

0

Решение

Все Информация Я видели предполагает, что не существует чистого способа изменить тип объекта. (PHP просто подделывает определенные виды приведения, например, есть (int) оператор но типа int сам по себе неизвестен.)

Подходы, которые я нашел, бывают двух типов:

  1. Сериализуйте ваш объект, взломайте строку, чтобы изменить ее тип, десериализуйте. (Увидеть Вот или же Вот— эквивалент). Или же

  2. Создайте новый объект и скопируйте все его свойства. (Увидеть Вот)

Я бы выбрал второй подход, поскольку вы, похоже, имеете дело с известной иерархией объектов:

class B extends A {
public function __construct(A $object) {
foreach($object as $property => $value) {
$this->$property = $value;
}
}
}

Если вы имеете некоторый контроль над созданием исходного объекта, рассмотрите возможность реализации фабричного шаблона, чтобы ваш объект создавался с типом B с самого начала.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]