严格的标准与致命错误/具体扩展与抽象实施相比

时间:2015-06-27 14:42:59

标签: php oop

我注意到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

这是输出

  

严格标准:D :: blah()的声明应与之兼容   C :: blah(ArrayAccess $ a)PHP致命错误:B :: blah()的声明   必须与A :: blah(ArrayAccess $ a)

兼容

我的问题 - 为什么PHP会以不同的方式对待这两种情况,历史原因可能呢?无论如何,对我来说似乎都是同样的问题。

我认为你可以在具体案例中侥幸逃脱,因为子类没有 来调用父类&#39;实施中的实施。无论哪种方式,我仍然很好奇。

1 个答案:

答案 0 :(得分:0)

我没有正式的词语来解释差异,但这就是我看待事物的方式。

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

类扩展可以定义自己的规则。这些规则应该类似于基类,否则当您通过其他实现交换实现时,事情会变得有些奇怪。但是,如果规则是不同的,但实施得到正确处理,那就是&#34;只是&#34;一个严格的错误。