功能覆盖中不同数量的参数

时间:2019-02-27 22:37:20

标签: php php-7 php-7.2 php-7.0

我想问一下如何启用完全错误报告,在我的情况下php.ini中的E_ALL和启动错误无效。

我的代码:

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时,必须具有与父类中相同数量的方法参数,这对我来说不是问题,但是问题是我没有关于此错误的任何php反馈。 您有什么主意为什么没有错误或异常?我正在使用开发php.ini并启用了所有错误显示。

1 个答案:

答案 0 :(得分:1)

此代码从7.0.33版到7.3版始终会产生不兼容的签名警告。

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

实际上,您无意间违反了SOLIDLiskov's Substitution PrincipleL规则:

  

程序中的对象应该可以用其子类型的实例替换,而不会改变程序的正确性。

您的示例中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生态系统中。