首页 > 解决方案 > 在(非可变)方法的覆盖中使用可变参数

问题描述

我正在尝试覆盖使用传统参数列表的类。为了允许更改底层方法的签名(我无法控制并且可能会更改,但我确实需要覆盖它),我一直在尝试使用可变参数,如下所示:

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)

根据我对 Liskov 替换原则的理解,我的代码应该是允许的——任何期望调用的代码A::demo都可以安全地调用B::demo,而不会产生任何错误。

我是否存在误解,或者只是没有人费心在 PHP 编译器中实现对这种(大概)边缘情况的支持?

我知道我可以改用它func_get_args()来模拟这种行为而不会激怒编译器,但我想知道为什么这种方法不起作用(而且 func_get_args 更慢)。

标签: phpliskov-substitution-principle

解决方案


推荐阅读