如何在 PHP - class 类型转换中将祖先分配给后代类型

How to assign ancestor to descendant type in PHP - class type casting

我正在尝试将祖先 (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 只允许某些类型而不允许其他用户定义的对象类型。

All the information I've seen 表明没有干净的方法来修改对象的类型。 (PHP 只是伪造某些类型的转换,例如,有一个 (int) 运算符,但类型 int 本身是未知的。)

我发现的方法有两种类型:

  1. 序列化您的对象,修改字符串以修改其类型,反序列化。 (参见 here or here-- 等效项)。或者

  2. 实例化一个新对象并复制其所有属性。 (参见 here

我会选择第二种方法,因为您似乎正在处理一个已知的对象层次结构:

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

如果您对原始对象的创建有一些控制,请考虑实施工厂模式,以便从一开始就使用 B 类型创建对象。