为什么PHP 5.2+不允许抽象静态类方法?

在PHP 5.2中启用严格警告之后,我看到了一个项目中的大量严格标准警告,这些项目最初编写时没有严格警告:


严格标准:静态函数 Program :: getSelectSQL()在Program.class.inc中不应抽象


有问题的函数属于抽象父类Program,并且被声明为抽象静态,因为它应该在其子类(例如TVProgram)中实现。


我确实在这里找到有关此更改的参考:


删除了抽象静态类函数。由于疏忽,PHP 5.0.x和5.1.x允许在类中使用抽象静态函数。从PHP 5.2.x开始,只有接口可以拥有它们。


我的问题是:有人可以清楚地解释为什么PHP中不应该有一个抽象的静态函数吗?


小怪兽爱吃肉
浏览 465回答 4
4回答

12345678_0001

解决此问题的方法非常简单,从设计的角度来看,这实际上是有意义的。正如乔纳森(Jonathan)写道:使用静态方法扩展任何类也是如此。如果扩展该类并创建具有相同签名的静态方法,则实际上并没有覆盖超类的静态方法。因此,作为一种解决方法,您可以执行以下操作:<?phpabstract class MyFoo implements iMyFoo {&nbsp; &nbsp; public static final function factory($type, $someData) {&nbsp; &nbsp; &nbsp; &nbsp; // don't forget checking and do whatever else you would&nbsp; &nbsp; &nbsp; &nbsp; // like to do inside a factory method&nbsp; &nbsp; &nbsp; &nbsp; $class = get_called_class()."_".$type;&nbsp; &nbsp; &nbsp; &nbsp; $inst = $class::getInstance($someData);&nbsp; &nbsp; &nbsp; &nbsp; return $inst;&nbsp; &nbsp; }}interface iMyFoo {&nbsp; &nbsp; static function factory($type, $someData);&nbsp; &nbsp; static function getInstance();&nbsp; &nbsp; function getSomeData();}?>现在,您可以强制所有子类MyFoo的子类都实现一个getInstance静态方法和一个公共的getSomeData方法。而且,如果您不继承MyFoo的子类,则仍然可以实现iMyFoo来创建具有类似功能的类。

交互式爱情

我看不出有什么理由禁止使用静态抽象函数。没有理由禁止使用它们的最好论据是,Java允许使用它们。问题是:-技术上可行吗?-是的,因为它存在于PHP 5.2中,并且存在于Java中。所以可以做到这一点。我们应该这样做吗?-有道理吗?是。实现类的一部分并将类的另一部分留给用户是有意义的。它在非静态函数中有意义,为什么对静态函数不有意义?静态函数的一种用法是不得超过一个实例(单例)的类。例如,加密引擎。它不必在多个实例中都存在,并且有防止这种情况的理由-例如,您只需保护内存的一部分不受入侵者的侵害。因此,实现引擎的一部分并将加密算法留给用户非常有意义。这只是一个例子。如果您习惯于使用静态函数,则会发现更多信息。
打开App,查看更多内容
随时随地看视频慕课网APP