gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-10-31 23:02:56 25 4
gpt4 key购买 nike

考虑以下代码:

abstract class ExampleClass
{
public static function regularStaticFunction()
{
return static::abstractStaticFunction();
}

abstract protected static function abstractStaticFunction();
}

ExampleClass::regularStaticFunction();

PhpStorm IDE 对 abstractStaticFunction 的声明发出警告,内容如下:

PHP Strict Standards: Static function 'abstractStaticFunction' should not be abstract.

Static function should not be abstract.

但是,PHP 在解析这个类时继续执行程序并输出如下:

PHP Strict standards: Static function ExampleClass::abstractStaticFunction() should not be abstract in php shell code on line 7

在我看来,因为 PHP 允许对抽象类调用静态函数,所以在抽象类上定义抽象静态函数应该是不可能的。

为什么解释器在 PHP 中允许抽象静态函数,而它们是无意义的?

最佳答案

这是来自 this answer 的很好的解释通过 Mark Amery :

PHP bug report 53081, called for the warning to be dropped since the addition of the static::foo() construct had made abstract static methods reasonable and useful. Rasmus Lerdorf (creator of PHP) starts off by labelling the request as bogus and goes through a long chain of bad reasoning to try to justify the warning. Then, finally, this exchange takes place:

Giorgio

i know, but:

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();

Rasmus

Right, that is exactly how it should work.

Giorgio

but it is not allowed :(

Rasmus

What's not allowed?

abstract class cA {
static function A(){static::B();}
abstract static function B();
}

class cB extends cA {
static function B(){echo "ok";}
}

cB::A();

This works fine. You obviously can't call self::B(), but static::B() is fine.

Rasmus 声称他的示例中的代码“工作正常”是 错误的;如您所知,它会引发严格模式警告。我猜他是 在没有开启严格模式的情况下进行测试。无论如何,一个困惑的拉斯穆斯 将请求错误地关闭为“伪造”。

这就是为什么警告仍然使用语言的原因。这可能不是 一个完全令人满意的解释——你可能是希望来到这里 警告有合理的理由。不幸的是,在 在现实世界中,有时选择源于平凡的错误, 错误的推理而不是理性的决策。这是 只是那些时代之一。

幸运的是,可贵的 Nikita Popov 已经从 PHP 7 中的语言作为 PHP RFC: Reclassify E_STRICT notices 的一部分.最终, 理智占了上风,一旦 PHP 7 发布,我们就可以愉快地 使用 abstract static 而不会收到这个愚蠢的警告。

关于php - 为什么PHP允许抽象静态函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41611058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com