【问题标题】:php abstract classes and interfaces involving static methods?php抽象类和接口涉及静态方法?
【发布时间】:2011-08-24 13:59:09
【问题描述】:

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

我的情况。

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

order_Outbound

和order_inbound

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

但是根据我所读到的关于 php 5.3 的内容,你不能有抽象的静态方法???

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

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

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

我可以在接口中有公共静态函数create()

并在 order_outbound 的实现中声明它为 public static function create($address, $reference, $orderID)

【问题讨论】:

  • 我没有看到代码,所以这只是一个猜测,但 Order::create()Order::get() 可能根本不应该是静态的,除非你有一些理由将它们设为静态。跨度>
  • @Crozin - 如果您出于某种原因不想使用构造函数,并且想要创建实例的方法,您可能不想创建实例来调用实例创建方法。
  • 对不起,这正是我这样做的原因。这些类代表数据库记录。我的构造函数受到保护并使用静态方法来检索类的实例。
  • 所以让它们代表数据库记录,别无他法。您应该有单独的对象来从数据库中检索数据并将其填充到对象中。

标签: php oop


【解决方案1】:

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

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

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

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

  2. 1234563这样您就可以实例化 OrderBuilder 并在此对象上调用 Create 方法来获取 Order 实例。
  3. (推荐)为什么不直接使用Order 构造函数?

【讨论】:

  • 在我的数据库中,我有 2 个表。 orderheader 和 orderbody。有出站和入站两种订单。我不想在没有数据库记录的情况下简单地创建对象的实例。因此使构造函数受到保护,并仅允许人们通过创建新的数据库记录 (order_outbound::create()) 或检索已存储的记录 (order_outbound::get(id)) 来获取实例。
  • 因为我从不打算扩展这两个类,您的建议是否只是忽略接口和抽象类,而只是将静态方法单独输入每个类而没有上层强迫我这样做?
  • 我会说如果你不想使用构造函数,那么可以使用静态方法,不要挂在“上层强制”位上。
  • 感谢您的帮助。这是我第一次设计如此庞大而复杂的系统,涉及如此多的不同类别。试图弄清楚他们应该如何一起工作一直是一个重大挑战。但很有趣。
  • 这个答案不正确。接口和抽象类可能需要后代来实现静态方法。
【解决方案2】:

更新

在@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 中删除了抽象静态方法。显然他们是一个疏忽。见Why does PHP 5.2+ disallow abstract static class methods?

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

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

【讨论】:

  • 其实可以在php中声明抽象的静态方法。
猜你喜欢
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-01
  • 1970-01-01
  • 2016-09-27
  • 1970-01-01
相关资源
最近更新 更多