在PHP中的虚函数的正确实施?(Correct Implementation of Virtual

2019-08-03 01:46发布

在我工作的地方(PHP只)我们有一个数据库抽象基类。 当你想一个新的数据库表添加到底层,你必须创建这个基类的子类,并覆盖一些方法来定义使用该表的个人行为。 正常的行为应该保持不变。

现在,我已经看到了在我们公司许多新的程序员,谁只是覆盖默认行为的方法。 一些是很“好”摆在所有的默认行为,只是添加有个别的东西,他们喜欢它,别人杀自理试图使用基类及其继承者。

我首先想到的解决这个问题,还想着应该由继承类重写的抽象方法。 但对抽象方法其他参数的旁边,“抽象”只是没有说明为什么在基类不能单独使用以及为什么这些功能应该被重写。

一些谷歌上搜索周围后,我没有找到一个很好的答案实现在PHP中“真实”的虚拟功能(只是有一个虚函数,几乎杀死一个具体实现的希望)。

所以,你会用这件事情呢?

Answer 1:

在PHP所有的公共保护的功能是“虚拟”的。 您可以防止通过前面加上被重写的功能最终关键字。 (或使其私有的,但是这可能是一个坏主意)。

在我认为,子类将要影响行为的基类的设计。 我会为例如创建一个像before_update()和after_insert空函数()。

function after_insert() {
  // Virtual
}

其中,当更新/插入事件发生时,基类将调用。

也许一个is_valid()函数,它总是在基类返回true,并使用commentblock来形容后果是什么,当一个子类返回false。

希望这会给你一些启发。



Answer 2:

您可以随时使用“最后”关键字,以防止某些类别的功能从,如果人们使用的方式是错误的类被覆盖。

像他们无法acheive某些功能,因此重写方法听起来给我。 您可能需要看看你的类的设计。



Answer 3:

如果没有你的基类的实现的一个例子,它是很难给出具体的信息。 但几件事情浮现在脑海中:

  1. 数据库抽象是开始与复杂的东西。 据我所知,你要保持它的瘦肉,干净的意思,但我认为这是相当不错的困难。 你真的要采取不同的DB引擎的规格进行彻底看看,看看哪些部分是通用的,哪些部分需要专业化。 也; 你确定你没有数据库抽象夹杂了表数据网关模式,因为你是在谈论通过扩展基类,添加数据库表?

  2. 您当前的基类的方法可能会做太多和/或不足够通用,首先,如果扩展类向后弯腰也保持清洁。 也许你应该打破基类的接口方法了较小的保护方法,这些方法一般足以在扩展类的重载方法被重用? 反之亦然:也许你应该有钩子重写你的接口方法的方法。

  3. 从点2以下:有什么不对具有某些一般的方法来实现一个抽象类,并让您的香草类(基类)和其他类的继承

  4. 最后,也许你应该只执行一个接口来实现,在扩展的基类代替?



文章来源: Correct Implementation of Virtual Functions in PHP?