请考虑以下代码:
abstract class ExampleClass { public static function regularStaticFunction() { return static::abstractStaticFunction(); } abstract protected static function abstractStaticFunction(); } ExampleClass::regularStaticFunction();
PhpStorm IDE对声明的声明发出警告abstractStaticFunction
:
PHP严格标准:静态函数'abstractStaticFunction'不应该是抽象的.
静态函数不应该是抽象的.
但是,PHP在解析此类时会继续执行程序并输出以下内容:
PHP严格标准:静态函数ExampleClass :: abstractStaticFunction()在第7行的php shell代码中不应该是抽象的
在我看来,因为PHP允许对抽象类进行静态函数调用,所以不应该在抽象类上定义抽象静态函数.
为什么解释器在PHP中允许抽象静态函数,当它们是荒谬的时候?
Mark Amery在这个答案中给出了很好的解释:
PHP错误报告53081,要求删除警告,因为添加
static::foo()
构造使得抽象静态方法合理且有用.Rasmus Lerdorf(PHP的创建者)开始时将请求标记为虚假,并经历了一系列糟糕的推理,试图证明警告的合理性.然后,最后,这次交换发生:乔治
我知道但是:
abstract class cA { //static function A(){self::B();} error, undefined method static function A(){static::B();} // good abstract static function B(); } class cB extends cA { static function B(){echo "ok";} } cB::A();拉斯穆斯
是的,这正是它应该如何运作的.
乔治
但是不允许:(
拉斯穆斯
有什么不允许的?
abstract class cA { static function A(){static::B();} abstract static function B(); } class cB extends cA { static function B(){echo "ok";} } cB::A();这很好用.你显然不能调用self :: B(),但是static :: B()很好.
Rasmus声称他的例子中的代码"工作正常"是错误的; 如你所知,它会抛出严格模式警告.我猜他没有打开严格模式就开始测试了.无论如何,一个混乱的Rasmus将请求错误地关闭为"虚假".
这就是警告仍在语言中的原因.这可能不是一个完全令人满意的解释 - 你可能来到这里希望警告有合理的理由.不幸的是,在现实世界中,有时选择是出于世俗的错误和错误的推理而不是理性的决策.这只是其中一次.
幸运的是,可评估的Nikita Popov已经删除了PHP 7中语言的警告,作为PHP RFC的一部分:重新分类E_STRICT通知.最终,理智得到了普及,一旦PHP 7发布,我们都可以愉快地使用
abstract static
而不会收到这个愚蠢的警告.