严格标准:childClass :: customMethod()的声明应与parentClass :: customMethod()的声明兼容
PHP中此错误的可能原因是什么?在哪里可以找到有关兼容的信息?
use Closure;
到类的顶部(因为类型提示是Closure
)。所以...一定要检查您是否缺少像这样的依赖项。
严格标准:childClass :: customMethod()的声明应与parentClass :: customMethod()的声明兼容
PHP中此错误的可能原因是什么?在哪里可以找到有关兼容的信息?
use Closure;
到类的顶部(因为类型提示是Closure
)。所以...一定要检查您是否缺少像这样的依赖项。
Answers:
childClass::customMethod()
与相比,具有不同的参数或不同的访问级别(公共/私有/受保护)parentClass::customMethod()
。
parentClass::customMethod($thing = false)
并且childClass::customMethod($thing)
会触发错误,因为子方法尚未为第一个参数定义默认值。
&
参数中的“&”号也可能触发此错误。
该消息表示存在某些可能的方法调用,这些方法调用可能在运行时失败。假设你有
class A { public function foo($a = 1) {;}}
class B extends A { public function foo($a) {;}}
function bar(A $a) {$a->foo();}
编译器仅根据不需要参数的A :: foo()的要求检查调用$ a-> foo()。但是$ a可能是需要参数的类B的对象,因此调用将在运行时失败。
但是,这绝不会失败并且不会触发错误
class A { public function foo($a) {;}}
class B extends A { public function foo($a = 1) {;}}
function bar(A $a) {$a->foo();}
因此,没有任何方法比其父方法具有更多的必需参数。
当类型提示不匹配时,也会生成相同的消息,但是在这种情况下,PHP的限制更大。这给出了一个错误:
class A { public function foo(StdClass $a) {;}}
class B extends A { public function foo($a) {;}}
就像这样:
class A { public function foo($a) {;}}
class B extends A { public function foo(StdClass $a) {;}}
这似乎比需要的限制更多,我认为这是由于内部因素造成的。
可见性差异会导致不同的错误,但出于相同的基本原因。没有任何一种方法比其父方法更不可见。
如果您想保留OOP表单而不关闭任何错误,还可以:
class A
{
public function foo() {
;
}
}
class B extends A
{
/*instead of :
public function foo($a, $b, $c) {*/
public function foo() {
list($a, $b, $c) = func_get_args();
// ...
}
}
func_get_args()
,即B
,public function foo($a = null, $b = null, $c = null)
作为这不撕毁合同的承诺A
。
在尝试从GitHub扩展现有类时遇到了这个问题。我要尝试解释一下自己,首先按原样编写课程,然后再按现在的方式写作。
我虽然
namespace mycompany\CutreApi;
use mycompany\CutreApi\ClassOfVendor;
class CutreApi extends \vendor\AwesomeApi\AwesomeApi
{
public function whatever(): ClassOfVendor
{
return new ClassOfVendor();
}
}
我终于做了什么
namespace mycompany\CutreApi;
use \vendor\AwesomeApi\ClassOfVendor;
class CutreApi extends \vendor\AwesomeApi\AwesomeApi
{
public function whatever(): ClassOfVendor
{
return new \mycompany\CutreApi\ClassOfVendor();
}
}
因此,当您使用返回命名空间类的方法,并且尝试返回相同的类但使用其他命名空间时,似乎也会出现此错误。幸运的是,我已经找到了该解决方案,但是我还没有完全理解php 7.2中此功能的好处,对我来说,通常可以根据需要重写现有的类方法,包括重新定义输入参数和/或行为。方法。
以前的方法的一个缺点是,IDE无法识别\ mycompany \ CutreApi \ ClassOfVendor()中实现的新方法。因此,现在,我将继续该实现。
目前完成
namespace mycompany\CutreApi;
use mycompany\CutreApi\ClassOfVendor;
class CutreApi extends \vendor\AwesomeApi\AwesomeApi
{
public function getWhatever(): ClassOfVendor
{
return new ClassOfVendor();
}
}
因此,我没有尝试使用“无论如何”的方法,而是编写了一个名为“ getWhatever”的新方法。实际上,他们两个都在做相同的事情,只是返回一个类,但是使用了前面所述的不同名称空间。
希望这可以帮助某人。
function customMethod( ... )
为每个函数发布标题(仅第一行:),我们可以告诉您特定的问题