为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
小怪兽爱吃肉 2019-10-17 15:27:47
在PHP 5.2中启用严格警告之后,我看到了一个项目中的大量严格标准警告,这些项目最初编写时没有严格警告:严格标准:静态函数 Program :: getSelectSQL()在Program.class.inc中不应抽象有问题的函数属于抽象父类Program,并且被声明为抽象静态,因为它应该在其子类(例如TVProgram)中实现。我确实在这里找到有关此更改的参考:删除了抽象静态类函数。由于疏忽,PHP 5.0.x和5.1.x允许在类中使用抽象静态函数。从PHP 5.2.x开始,只有接口可以拥有它们。我的问题是:有人可以清楚地解释为什么PHP中不应该有一个抽象的静态函数吗?
查看完整描述

4 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

解决此问题的方法非常简单,从设计的角度来看,这实际上是有意义的。正如乔纳森(Jonathan)写道:


使用静态方法扩展任何类也是如此。如果扩展该类并创建具有相同签名的静态方法,则实际上并没有覆盖超类的静态方法。


因此,作为一种解决方法,您可以执行以下操作:


<?php

abstract class MyFoo implements iMyFoo {


    public static final function factory($type, $someData) {

        // don't forget checking and do whatever else you would

        // like to do inside a factory method

        $class = get_called_class()."_".$type;

        $inst = $class::getInstance($someData);

        return $inst;

    }

}



interface iMyFoo {

    static function factory($type, $someData);

    static function getInstance();

    function getSomeData();

}

?>

现在,您可以强制所有子类MyFoo的子类都实现一个getInstance静态方法和一个公共的getSomeData方法。而且,如果您不继承MyFoo的子类,则仍然可以实现iMyFoo来创建具有类似功能的类。


查看完整回答
反对 回复 2019-10-17
?
交互式爱情

TA贡献1712条经验 获得超3个赞

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


查看完整回答
反对 回复 2019-10-17
  • 4 回答
  • 0 关注
  • 464 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信