函数覆盖中的不同数量的参数

Different number of parameters in function overriding

我想问一下如何启用完整的错误报告,E_ALL 和 php.ini 中的启动错误对我的情况没有影响。

我的代码:

class A
{
   function funcA(arg1=null, arg2=null, arg3=false, arg4=null) {}
}

class B extends A
{
   function funcB() {}
}

class C extends B
{
   function funcA(arg1=null, arg2=null, arg3=false) {}
}

在 php 7.0 中它被允许并且它正在工作,在升级到 php 7.2.15 后 php 出现某种崩溃,脚本执行停止,没有错误在错误日志中。对于 php 7.2,必须有与父 class 相同数量的方法参数,这对我来说不是问题,但问题是我没有从 php 那里得到任何关于这个错误。 您知道为什么没有错误或异常吗?我正在使用已启用所有错误显示的开发 php.ini。

从版本 7.0.33 到 7.3,此代码总是产生不兼容的签名警告。

这里可以确认:https://3v4l.org/Ifmbk

实际上,您无意中违反了 SOLID, which stands for Liskov's Substitution PrincipleL 规则:

Objects in a program should be replaceable with instances of their subtypes without altering the correctness of that program.

您的示例中 CA 的实例在字面上不可互换,即使在签名中有可选参数也是如此。

不过,您至少有两个选择,它们都需要更改设计并且警告本身确认气味的存在。

如果公共功能确实很少,则取消继承并使用组合:

class B
{
   /**
    * A
    */ 
   private $a;

   public function __construct(A $a) {
       $this->a = $a;
   }
}

或者将功能拆分为不同的方法,并有一个更宽松的接口来接受 AbcInterface 在其他地方并验证您在实际实现中获得的实例类型:

interface AbcInterface
{
    public function B();
}

class A implements AbcInterface
{
    public function funcA($arg1=null, $arg2=null, $arg3=false, $arg4=null)
    {
    }

    public function funcAWithLessArgs($arg1=null, $arg2=null, $arg3=false)
    {
    }
}

实际上,您在这里需要的是 function overloading,它从一开始就不存在于 PHP 生态系统中。