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

时间:2011-05-13 01:11:47

标签: php oop

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

我的情况。

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

order_Outbound

和order_inbound

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

但是从我读过的关于php 5.3的内容来看,你不能有抽象的静态方法???

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

中实现它吗?

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

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

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

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

2 个答案:

答案 0 :(得分:11)

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

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

因此,我看到了三个解决方案

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

  2. 如果您想要一个方法来创建类的实例,但又不想要求实例调用此方法,则可以创建“Builder”类来实现此目的(例如OrderBuilder ),以便您实例化OrderBuilder并在此对象上调用Create方法,而不是获取Order个实例。

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

答案 1 :(得分:2)

<强>更新

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

  • 适用于版本5&gt; 5.1.6
  • 不适用于5.2&gt; 38年6月5日
  • 适用于7.0.0&gt; 7.3.1

确认它已在PHP 5.2中删除,但如果您使用的是PHP 7+,则可以再次使用抽象静态方法。

原始回答

是的,在PHP 5.2中删除了抽象静态方法。显然他们是一个疏忽。请参阅Why does PHP 5.2+ disallow abstract static class methods?

但是,您可以在界面中使用静态方法,请参阅this comment on php.net

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