Why PHP's Strict Mode Disallows Abstract Static Class Methods
In PHP 5.2, enabling strict warnings would trigger warnings for abstract static class methods. This restriction was implemented due to PHP 5.0.x and 5.1.x mistakenly allowing such methods, with the intention of disallowing them in later versions.
The Problem with Abstract Static Methods in PHP 5.2
The issue arises from the behavior of late static bindings, which were not introduced until PHP 5.3. In PHP 5.2, code like the example below would not work as intended:
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();
In this case, self::bar() would explicitly refer to the bar() method in ParentClass, even when foo() was called as a method of ChildClass. This rendered abstract static methods in PHP 5.2 useless, as the whole point of abstract methods is to allow for different implementations in child classes.
The Lack of Justification Post PHP 5.3
With the introduction of late static bindings in PHP 5.3, the main argument against abstract static methods was eliminated. Static::bar() could now be used instead of self::bar() in the example above, allowing methods defined in a parent class to call static methods in child classes.
The Persistence of the Warning
Despite the introduction of late static bindings, the warning for abstract static methods remained in PHP. PHP bug report 53081, which called for its removal, was erroneously closed as "bogus" due to a misunderstanding by Rasmus Lerdorf, the creator of PHP.
The Resolution in PHP 7
Finally, in PHP 7, the warning was removed. PHP RFC: Reclassify E_STRICT notices reclassified it as a notice, no longer raising an error in strict mode. This change recognizes the usefulness and validity of abstract static methods.
The above is the detailed content of Why Did PHP Disallow Abstract Static Class Methods in Strict Mode?. For more information, please follow other related articles on the PHP Chinese website!