Я пытаюсь переопределить класс, который использует традиционный список аргументов. Чтобы учесть изменения в сигнатуре базового метода (которую я не могу контролировать и которую можно изменить, но мне нужно ее переопределить), я пытался использовать переменные аргументы, например:
class A {
public function demo($a) {}
}
class B extends A {
public function demo(...$args) {}
}
Тем не менее, это испускает строгую ошибку,
Declaration of B::demo(...$args) should be compatible with A::demo($b)
Исходя из моего понимания принципа подстановки Лискова, мой код должен быть разрешен — любой код, который должен вызывать A::demo
смело мог позвонить B::demo
, без каких-либо ошибок.
Есть ли недоразумение с моей стороны, или просто никто не удосужился реализовать поддержку этого (предположительно) крайнего случая в компиляторе PHP?
Я знаю, что я могу использовать func_get_args()
вместо этого, чтобы эмулировать это поведение, не раздражая компилятор, но я хотел бы знать, почему этот подход не работает (и func_get_args медленнее).
Задача ещё не решена.
Других решений пока нет …