php抽象类和涉及静态方法的接口?

rog*_*der 11 php oop

我正在努力研究如何最好地完成我的课程设计工作.

我的情况.

我有一个订单抽象类,其中包含2个子类所需的订单方法和信息

order_Outbound

和order_inbound

每个子类需要2个名为create和get的静态公共方法

但从我所读到的关于PHP 5.3你不能有抽象的静态方法???

所以我的想法是有一个接口Order_Interface接管该角色,但我该如何实现它.我还在父类中实现它吗?

在这种情况下,父抽象类仍然需要我在抽象类中创建一个get和create方法.或者我在孩子们中实现它并从抽象类扩展???

也!!!出站和入站子节点都需要创建静态方法,但需要传递不同的参数

我可以在界面中有公共静态函数create()

并在order_outbound中的实现声明它公共静态函数create($ address,$ reference,$ orderID)

Mat*_*ell 11

在大多数语言(包括PHP)中,您不能要求类实现静态方法.

这意味着类继承和接口都不允许您要求所有实现者定义静态方法.这可能是因为这些功能旨在支持多态而不是类型定义.在静态方法的情况下,你永远不会有一个对象来解析类型,所以必须ClassName::Method明确地做,所以理论是你不会从多态获得任何东西.

因此,我看到三种解决方案

  1. 在每个类中声明静态方法(毕竟,你永远不会去

  2. 如果你想要一个方法来创建你的类的实例,但又不想要一个实例来调用这个方法,你可以创建"Builder"类来实现这个目的(例如OrderBuilder),这样你实例化OrderBuilder并调用Create方法而是在这个对象上获取Order实例.

  3. (推荐)为什么不简单地使用Order构造函数?


sun*_*sun 7

PHP 7.4+允许在接口中要求静态方法:

interface StaticInterface {
    public static function interfaceMethod();
}

class MyProvider implements StaticInterface {
    //public static function interfaceMethod() {}
}
Run Code Online (Sandbox Code Playgroud)

没有方法的致命错误:https://3v4l.org/YbA4u

实现该方法时没有错误: https: //3v4l.org/QNRJB


Yep*_*_Me 6

更新

在 @hvertous 发表评论后,我决定对此进行测试。使用3v4l我们可以看到abstract public static method

  • 适用于版本 5 > 5.1.6
  • 不适用于 5.2 > 5.6.38
  • 适用于 7.0.0 > 7.3.1

这证实它在 PHP 5.2 中已被删除,但如果您使用 PHP 7+,您可以再次使用抽象静态方法。

原答案

是的,抽象静态方法在 PHP 5.2 中被删除。显然他们是一个疏忽。请参阅为什么 PHP 5.2+ 不允许抽象静态类方法?

但是,您可以在接口中使用静态方法,请参阅php.net 上的评论

您面临的问题是您希望您的实现具有不同的函数签名,这意味着您可能不应该使用继承来解决您的问题。