PHP 在 5.2 中废除抽象静态类方法
在 PHP 5.2 及更高版本中,禁止在类中使用抽象静态方法。这个决定源于疏忽、设计缺陷和对 self 关键字的误解。
有问题的上下文
最初,PHP 5.0x 和 5.1x 错误地允许在类中声明抽象静态函数。然而,由于缺乏后期静态绑定,这变得毫无用处。因此,类似下面的代码将会失败:
abstract class ParentClass { static function foo() { self::bar(); } abstract static function bar(); } class ChildClass extends ParentClass { static function bar() { echo "Hello, World!"; } } ChildClass::foo();
在此示例中,foo() 中的 self::bar() 调用引用了 ParentClass 中的 bar() 方法,即使 foo( ) 作为 ChildClass 的方法被调用。因此,代码会生成致命错误,表明无法调用抽象方法 ParentClass::bar()。
警告的理由
鉴于此限制,PHP 5.2 正确地发出警告,劝阻使用抽象静态方法。由于它们没有实际用途,任何使用都可能是由于误解而被认为是糟糕的代码。
误解已解决
PHP 5.3 引入了最新的静态绑定,允许父类中的方法访问子类中的静态方法。有了这个补充,禁止抽象静态方法的理由就变得不那么令人信服了。然而,由于暴露损坏的静态方法可能会出现问题,警告仍然存在。
错误及其解决方案
不幸的是,Rasmus Lerdorf 的误解, PHP 的创建者错误地关闭了一份主张删除警告的错误报告。随后,尽管缺乏充分的理由,该警告仍然存在。
抽象静态方法的未来
幸运的是,PHP 7 终于删除了该警告,因为RFC 中提议:重新分类 E_STRICT 通知。随着其废除,开发人员可以再次使用抽象静态方法,而不会遇到虚假警告。
以上是为什么 PHP 5.2 中取消了抽象静态类方法?的详细内容。更多信息请关注PHP中文网其他相关文章!