如何在PHP中抑制虚方法?

时间:2016-01-30 08:04:30

标签: php virtual-method

假设我有动物和狗类(狗继承自动物)。对于每个类,我都有一个具有相同签名的方法(受保护)foo。那些方法应该是常规方法,非虚方法。但是由于PHP现在所有非私有方法都是虚拟的,所以我遇到了问题。

在我开始编写一些变通方法之前,可能会以更简单的方式解决。即:

  • 是否可以在PHP中将方法标记为非虚拟?

  • “坐在”给定的班级(动物或狗)内是否可以在当前类的上下文中调用foo,因此虚拟机制不会启动?

1 个答案:

答案 0 :(得分:2)

您可以将方法标记为final

class foo {
    final protected function bar() {} //can not be overriden
}

甚至将课程标记为最终成绩:

final class foo { // can not be extended
    //...
}

您可以将self关键字与方法调用结合使用,以在当前类的上下文中调用方法:

class A {
    function aa() { echo 1; }
    function cc() { self::aa(); }
    function dd() { $this->aa(); }
}

class B extends A {
    function aa() { echo 2; }
    function bb() { self::aa(); }
}

$b = new B;
$b->bb(); //2 - the value from B::aa() - call from B's context
$b->cc(); //1 - the value from A::aa() - call from A's context
$b->dd(); //2 - the value from B::aa() - regular virtual call