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

Я пытаюсь присвоить предку (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 допускаются только определенные типы, но не другие определяемые пользователем типы объектов.

1 ответ

Решение

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

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

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

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

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

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

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

Другие вопросы по тегам