Для более сложной иерархии классов я немного поиграл с минимальным примером этой проблемы.
Этот класс задан - метод "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()
, чтобы проверить, правильно ли вызван текущий подкласс, реализующий конструктор? Как бы вы справились с этим, если бы кто-то еще мог реализовать дополнительные подклассы в иерархии?