![]() |
1
74
静态方法属于声明它们的类。扩展类时,可以创建同名的静态方法,但实际上并没有实现静态抽象方法。 用静态方法扩展任何类也一样。如果扩展该类并创建具有相同签名的静态方法,则实际上不会重写超类的静态方法。
编辑
(2009年9月16日)
修正
(由费弗罗)
|
![]() |
2
71
这是一个漫长而悲伤的故事。 当php 5.2第一次引入这个警告时, late static bindings 还没有用语言。如果您不熟悉最新的静态绑定,请注意,这样的代码可能无法按预期工作:
撇开严格的模式警告不谈,上面的代码不起作用。这个
鉴于此,PHP5.2中的抽象静态方法是无用的。这个
整点
使用抽象方法的好处在于,您可以编写调用该方法的代码,而不知道它将调用什么实现,然后在不同的子类上提供不同的实现。但是,由于php 5.2没有提供一种干净的方法来编写调用子类的静态方法的父类的方法,因此抽象静态方法的这种用法是不可能的。因此任何使用
但后来又增加了php 5.3的引用类的能力,通过
添加了static关键字后,将
我想,你还是可以提出保留警告的理由。例如,在我上面的示例中,您可能会争辩说,由于PHP允许您调用抽象类的静态方法(即使在通过替换来修复它之后)
所以基于这个论点,PHP开发人员用语言保存了警告,对吗? 休斯敦大学, not exactly .
上面链接的php bug报告53081要求在添加
Rasmus声称他的示例中的代码“工作正常”是错误的;正如您所知,它抛出了一个严格的模式警告。我猜他在测试时没有打开严格的模式。不管怎样,一个困惑的拉斯穆斯将请求错误地关闭为“伪造”。 这就是为什么警告仍然是用语言表达的。这可能不是一个完全令人满意的解释——你可能来这里希望有一个合理的理由,警告。不幸的是,在现实世界中,有时选择是从平凡的错误和错误的推理中产生的,而不是从理性的决策中产生的。这只是其中一次。
幸运的是,可估计的nikita popov已经从php 7语言中删除了警告,作为
PHP RFC: Reclassify E_STRICT notices
. 最终,理智占了上风,一旦php 7发布,我们都可以很高兴地使用它。
|
![]() |
3
70
对于这个问题,有一个非常简单的解决方法,从设计的角度来看,这实际上是有意义的。正如乔纳森所写:
所以,作为一项工作,你可以这样做:
现在,您可以强制任何类子类myfoo实现getInstance静态方法和公共getSomeData方法。如果不将myfoo子类化,您仍然可以实现imyfoo来创建具有类似功能的类。 |
![]() |
4
12
我知道这是旧的,但是…… 为什么不直接抛出一个异常这个父类的静态方法,如果不重写它,就会导致异常。 |
![]() |
5
4
我认为抽象类/接口可以看作是程序员之间的契约。它更多地处理事物的外观/行为,而不是实现实际的功能。正如在php5.0和5.1.x中所看到的,这不是阻止PHP开发人员这样做的自然法则,而是促使其他语言中的OO设计模式一起使用的冲动。基本上,如果一个人已经熟悉其他语言,这些想法试图防止意外的行为。 |
![]() |
6
2
我认为没有任何理由禁止静态抽象函数。没有理由禁止它们的最好的理由是,它们被允许在Java中使用。 问题是: -技术上可行吗?-是的,因为存在于PHP 5.2中,它们存在于Java中。 所以我能做到。我们应该这样做吗? -它们有意义吗?对。实现类的一部分并将类的另一部分留给用户是有意义的。它在非静态函数中是有意义的,为什么它不应该对静态函数有意义呢?静态函数的一种用法是类,其中不能有多个实例(单例)。例如,加密引擎。它不需要存在于多个实例中,并且有理由防止这种情况发生——例如,您必须只保护内存的一部分以防入侵者。因此,实现引擎的一部分并将加密算法留给用户是完全有意义的。 这只是一个例子。如果你习惯使用静态函数,你会发现更多。 |
![]() |
7
0
在php 5.4+中,使用特性:
在你们班上,把乞讨的话说出来:
|
![]() |
8
-1
研究PHP的“后期静态绑定”问题。如果您将静态方法放在抽象类上,您可能会很快遇到它,而不是很晚。严格的警告告诉您避免使用中断的语言功能是有意义的。 |
![]() |
eddyP23 · java中扩展抽象外部类的静态内部类[重复] 7 年前 |
![]() |
John · 抽象类继承的泛型接口的实例化问题 7 年前 |
![]() |
Typhaon · 我可以在抽象类中更改变量的类吗 8 年前 |
![]() |
ReX357 · JAVA:抽象静态方法的合法需求 10 年前 |
![]() |
Banjo Drill · AngularJS可重复使用工厂 10 年前 |
![]() |
user3667122 · 如何在Java中将静态抽象类用作回调? 10 年前 |