函数覆盖中的不同数量的参数
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 Principle 的 L
规则:
Objects in a program should be replaceable with instances of their subtypes without altering the correctness of that program.
您的示例中 C
和 A
的实例在字面上不可互换,即使在签名中有可选参数也是如此。
不过,您至少有两个选择,它们都需要更改设计并且警告本身确认气味的存在。
如果公共功能确实很少,则取消继承并使用组合:
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 生态系统中。
我想问一下如何启用完整的错误报告,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 Principle 的 L
规则:
Objects in a program should be replaceable with instances of their subtypes without altering the correctness of that program.
您的示例中 C
和 A
的实例在字面上不可互换,即使在签名中有可选参数也是如此。
不过,您至少有两个选择,它们都需要更改设计并且警告本身确认气味的存在。
如果公共功能确实很少,则取消继承并使用组合:
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 生态系统中。