Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 严格标准vs致命错误/具体扩展vs抽象实现_Php_Oop - Fatal编程技术网

Php 严格标准vs致命错误/具体扩展vs抽象实现

Php 严格标准vs致命错误/具体扩展vs抽象实现,php,oop,Php,Oop,我注意到PHP的行为有所不同,这取决于类是对具体基类进行子类化,还是实现抽象基类方法或接口,这与方法签名中的同根性有关。考虑这两个例子 //---------------------------- // Strict Error //---------------------------- class C { function blah(ArrayAccess $a) {} } class D extends C { function blah($a) {} } // <- No typ

我注意到PHP的行为有所不同,这取决于类是对具体基类进行子类化,还是实现抽象基类方法或接口,这与方法签名中的同根性有关。考虑这两个例子

//----------------------------
// Strict Error
//----------------------------
class C { function blah(ArrayAccess $a) {} }

class D extends C { function blah($a) {} } // <- No type-hint in subclass method

//----------------------------
// Fatal Error
//----------------------------
interface A { function blah(ArrayAccess $a); }

class B implements A { function blah($a) {} } // <- No type-hint in subclass method
//----------------------------
//严格错误
//----------------------------
类C{函数blah(ArrayAccess$a){}

类D扩展了C{function blah($a){}/,我没有正式的词汇来解释这种差异,但下面是我对事物的看法

接口是实现的公共契约。作为合同,您必须遵守界面中定义的规则。不跟随他们违反合同,这是一个致命的错误


类扩展可以定义自己的规则。这些规则应该类似于基类,否则当您用另一个实现交换一个实现时,事情会变得有点奇怪。但是,如果规则不同,但实现得到了正确处理,那“只是”一个严格的错误。

可能会让您感兴趣:->
当重写方法时,参数签名
应保持不变,否则PHP将
生成严格级别的错误…和接口:->
实现接口的类必须使用完全相同的方法签名。。。如果不这样做,将导致致命错误…
我认为问题是,在第一种情况下,您应该使用相同的签名,而另一种情况下,您不能使用接口,您正在“强制”实现它的类实现所有方法。当你从另一个类进行扩展时,你可以覆盖它,这样做的时候,你只需要“应该”使用相同的签名,但是你不需要感谢这些链接,但是它没有说明为什么,这正是我想要的。手册中的说明并不比错误消息本身更具信息性。