当前位置:  开发笔记 > 编程语言 > 正文

为什么PHP允许抽象静态函数

如何解决《为什么PHP允许抽象静态函数》经验,为你挑选了1个好方法。

请考虑以下代码:

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中允许抽象静态函数,当它们是荒谬的时候?



1> German Lashe..:

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而不会收到这个愚蠢的警告.

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有