代码之家  ›  专栏  ›  技术社区  ›  erikbstack

PHP中虚函数的正确实现?

  •  23
  • erikbstack  · 技术社区  · 16 年前

    在我的工作场所(仅限php),我们有一个用于数据库抽象的基类。当你想在基础层添加一个新的数据库表时,你必须创建这个基类的一个子类,并重写一些方法来定义使用这个表的个人行为。正常的行为应该保持不变。

    现在我在我们公司看到了许多新程序员,他们只是重写默认行为的方法。有些人非常“友好”地加入了所有默认行为,只是在他们喜欢的地方添加了个人内容,而另一些人则试图使用基类和继承者而自杀。

    为什么 为什么 这些函数应该被覆盖。

    3 回复  |  直到 14 年前
        1
  •  31
  •   Bob Fanger    15 年前

    在PHP中所有 公共 受保护的 功能是“虚拟的”。您可以通过在前面添加 final 关键字。(或者把它们保密,但这可能是个坏主意)。

    在基类的设计中,我会考虑子类想要影响的行为。 例如,我会创建空函数,如before_update()和after_insert()。

    function after_insert() {
      // Virtual
    }
    

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

    也许一个is_valid()函数在基类中总是返回true,并使用commentblock来描述子类返回false时的后果。

    希望这能给你一些启发。

        2
  •  4
  •   Rob    16 年前

    在我看来,他们无法实现某些功能,因此覆盖了这些方法。你可能需要看看你的类的设计。

        3
  •  0
  •   Decent Dabbler    16 年前

    如果没有基类实现的示例,就很难给出具体的信息。但我想到了几件事:

    1. 数据库抽象一开始就很复杂。我明白你想保持整洁、干净和刻薄,但我认为这很难。你真的必须彻底了解不同数据库引擎的规格,看看哪些部分是通用的,哪些部分需要专门化。也;当您谈论通过扩展基类来添加DB表时,您确定没有将DB抽象与表数据网关模式混淆吗?

    2. 如果扩展类过于向后弯曲,那么当前基类的方法可能做得太多和/或一开始就不够通用,请保持干净。也许你应该把基类接口方法分解成更小的受保护方法,这些方法足够通用,可以在扩展类的重写方法中重用?反之亦然:也许你应该在接口方法中有可重写方法的钩子。

    3. 从第2点开始:有一个带有一些通用实现方法的抽象类,并让你的vanilla类(你的基类)和其他类继承自 ?

    4. 最后,也许你应该强制实现一个接口,而不是扩展基类?