为什么 PHP 的严格模式不允许抽象静态类方法
在 PHP 5.2 中,启用严格警告将触发抽象静态类方法的警告。实施此限制是由于 PHP 5.0.x 和 5.1.x 错误地允许此类方法,并打算在以后的版本中禁止它们。
PHP 5.2 中抽象静态方法的问题
这个问题是由后期静态绑定的行为引起的,直到 PHP 5.3 才引入。在 PHP 5.2 中,如下例所示的代码将无法按预期工作:
abstract class ParentClass { static function foo() { echo "I'm gonna do bar()"; self::bar(); } abstract static function bar(); } class ChildClass extends ParentClass { static function bar() { echo "Hello, World!"; } } ChildClass::foo();
在这种情况下, self::bar() 将显式引用 ParentClass 中的 bar() 方法,即使 foo( ) 作为 ChildClass 的方法被调用。这使得 PHP 5.2 中的抽象静态方法毫无用处,因为抽象方法的全部意义在于允许子类中的不同实现。
PHP 5.3 后缺乏合理性
随着 PHP 5.3 中后期静态绑定的引入,反对抽象静态方法的主要争论被消除了。现在可以使用 Static::bar() 代替上面示例中的 self::bar(),允许父类中定义的方法调用子类中的静态方法。
警告
尽管引入了最新的静态绑定,但抽象静态方法的警告仍然保留在 PHP 中。由于 PHP 创始人 Rasmus Lerdorf 的误解,要求删除的 PHP 错误报告 53081 被错误地关闭为“虚假”。
PHP 7 中的解决方案
最后,在 PHP 7 中,该警告被删除。 PHP RFC:重新分类 E_STRICT 通知将其重新分类为通知,不再在严格模式下引发错误。此更改认可了抽象静态方法的有用性和有效性。
以上是为什么 PHP 不允许在严格模式下使用抽象静态类方法?的详细内容。更多信息请关注PHP中文网其他相关文章!