对于一些更复杂的类层次结构,我用一个最小的例子来解决这个问题。
给出了这个类 - 可以修改方法“createOrUpdate()”:
class A {
protected $a;
protected $b;
protected $c;
function __construct($a,$b,$c) {
$this->a = $a;
$this->b = $b;
$this->c = $c;
}
public static function createOrUpdate($a,$b,$c) {
if(self::exists($b)) {
someWhateverUpdate();
} else {
new static($a,$b,$c);
}
}
}
现在让我们看看如果我们扩展它会发生什么:
class B extends A {
function __construct($a,$b,$c) {
parent::__construct($a,$b,$c);
}
}
B::createOrUpdate("rock","this","now");
工作正常!
class C extends B {
function __construct($a,$b) {
parent::__construct($a,$b,"exactly");
}
}
C::createOrUpdate("rock","this","now");
也可以正常工作,但是如果有人确实 createOrUpdate() 参数 $c 会默默地丢失!
class D extends A {
protected $d;
function __construct($a,$b,$c,$d) {
$this->a = $a;
$this->b = $b;
$this->c = $c;
$this->d = $d;
}
}
D::createOrUpdate("rock","this","now");
错误:引发ArgumentCountError
class E extends A {
function __construct($b,$c) {
$this->a = "Lorem";
$this->b = $b;
$this->c = $c;
}
}
D::createOrUpdate("rock","this","now");
错误:有效,但行为完全出乎意料。
现在我的问题是:我可以在内部使用一些反射createOrUpdate()
来检查当前调用的子类是否正确地实现了构造函数?如果其他人可以在层次结构中实现更多子类,您将如何处理?