我注意到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
这里是输出结果:
我的问题 - 为什么PHP会以不同的方式处理这两种情况,历史原因可能吗?在我看来,两种情况都是同样的问题。严格标准:D的blah()声明应与C :: blah(ArrayAccess $ a)兼容 PHP致命错误:B的blah()声明必须与A :: blah(ArrayAccess $ a)兼容
我认为在具体情况下你可以做到这一点,因为子类在其实现中不必调用父类的实现。无论如何,我仍然很好奇。
当覆盖方法时,参数签名应该保持不变,否则PHP会生成E_STRICT级别的错误...
而接口:http://php.net/manual/en/language.oop5.interfaces.php#language.oop5.interfaces.implements ->实现接口的类必须使用完全相同的方法签名...否则将导致致命错误...
我认为问题在于,在第一种情况下,你应该使用相同的签名,而另一种情况则行不通。 - Rizier123