如何在 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'}
}
我试过:
重写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
只允许某些类型而不允许其他用户定义的对象类型。
All the information I've seen 表明没有干净的方法来修改对象的类型。 (PHP 只是伪造某些类型的转换,例如,有一个 (int)
运算符,但类型 int
本身是未知的。)
我发现的方法有两种类型:
序列化您的对象,修改字符串以修改其类型,反序列化。 (参见 here or here-- 等效项)。或者
实例化一个新对象并复制其所有属性。 (参见 here)
我会选择第二种方法,因为您似乎正在处理一个已知的对象层次结构:
class B extends A {
public function __construct(A $object) {
foreach($object as $property => $value) {
$this->$property = $value;
}
}
}
如果您对原始对象的创建有一些控制,请考虑实施工厂模式,以便从一开始就使用 B
类型创建对象。
我正在尝试将祖先 (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
只允许某些类型而不允许其他用户定义的对象类型。
All the information I've seen 表明没有干净的方法来修改对象的类型。 (PHP 只是伪造某些类型的转换,例如,有一个 (int)
运算符,但类型 int
本身是未知的。)
我发现的方法有两种类型:
序列化您的对象,修改字符串以修改其类型,反序列化。 (参见 here or here-- 等效项)。或者
实例化一个新对象并复制其所有属性。 (参见 here)
我会选择第二种方法,因为您似乎正在处理一个已知的对象层次结构:
class B extends A {
public function __construct(A $object) {
foreach($object as $property => $value) {
$this->$property = $value;
}
}
}
如果您对原始对象的创建有一些控制,请考虑实施工厂模式,以便从一开始就使用 B
类型创建对象。