0

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

4

1 回答 1

1

看到所有信息都表明没有干净的方法来修改对象的类型。(PHP 只是伪造某些类型的转换,例如,有一个运算符,但类型本身是未知的。)(int)int

我发现的方法有两种:

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

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

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

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

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

于 2015-09-14T10:19:20.090 回答