【问题标题】:Problem with extending a Class扩展类的问题
【发布时间】:2011-05-02 07:28:45
【问题描述】:

我在扩展一个本身进一步扩展抽象类的类时遇到问题。

基础抽象类有以下方法:

摘要:

private final __construct()
abstract protected function loadFromId()
private static final load($id)

类 1 扩展摘要:

protected loadFromId()

2 类扩展 1 类:

//nothing as of yet

我从 Class 2 扩展 Class 1 的原因是因为我需要它返回 Class 1 的一个实例。Class 2 基本上会返回一个 null 对象以进行验证。

如果我尝试扩展第 1 类:

Class 2 extends Class 1 { }

我收到以下错误“Cannot override final method class::__construct()”,显然是因为它是私有方法。

有没有办法可以基于 Class 1 创建一个空对象?

【问题讨论】:

  • 如果您实际上在其中一个子类中放置了另一个构造函数(由于final keyword 而显然无法工作),您应该只获得Cannot override final method class::__construct()。否则,你应该得到一个Fatal error: Call to private A::__construct() from invalid context

标签: php inheritance abstract-class


【解决方案1】:

您收到的错误是由于您在 Abstract 超类中将您的construct() 函数声明为final,这意味着您无法覆盖它。删除它应该没有问题。

附带说明:使用继承时使用protected 更安全。除非您绝对确定您的子类中不需要该字段/函数。

【讨论】:

  • 感谢您的意见。我们修改了抽象构造函数,使其可以接受空 id。如果找到一个空 $id,我们使用 get_call_class 确定调用类,然后我们可以将“_Null”分配给它以实例化空对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
  • 2015-03-26
  • 2013-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多