php 抽象类 静态方法吗,关于oop:php抽象类和涉及静态方法的接口?

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

我的情况。

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

order_Outbound

和order_inbound

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

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

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

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

也!!!

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

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

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

我没有看到代码所以它只是一个猜测,但Order::create()和Order::get()可能根本不应该是静态的,除非你有一些理由将它们静态化。

@Crozin - 如果由于某种原因你不想使用构造函数,并且想要一个方法来创建实例,你可能不希望创建一个实例来调用实例创建方法。

对不起,这就是我这样做的原因。 这些类代表数据库记录。 我的构造函数受到保护,并使用静态方法来检索类的实例。

所以让他们代表数据库记录,不做任何其他事情。 您应该有单独的对象,用于从数据库中检索数据并将其填充到对象中。

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

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

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

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

如果你想要一个方法来创建你的类的实例,但又不想要一个实例来调用这个方法,你可以创建"Builder"类来实现这个目的(例如OrderBuilder),这样你就可以实例化一个< x1>并调用此对象上的Create方法来获取Order实例。

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

在我的数据库中我有2个表。订单和订单。出站和入站有2种订单。我不希望能够在没有数据库记录的情况下简单地创建对象的实例。所以使构造函数受到保护,并允许人们只通过创建新的数据库记录(order_outbound :: create())或检索已存储的记录(order_outbound :: get(id))来获取实例。

因为我从不打算扩展这两个类,你的建议只是忽略接口和抽象类,只是单独输入静态方法到每个类中而没有上层强迫我?

我想如果你不想使用构造函数,那么是的,请使用静态方法,并且不要挂在"上层强制"位上。

谢谢您的帮助。这是我第一次设计这么庞大而复杂的系统,涉及许多不同的类。试图弄清楚他们应该如何一起工作是一项重大挑战。但有趣的一个。

这个答案是不正确的。接口和抽象类可以要求后代实现静态方法。

更新

在@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上的此注释。

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

实际上,你可以在php中声明抽象静态方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值