如何抑制 PHP 中的虚拟方法?
How to suppress virtual methods in PHP?
假设我有 class 动物和狗(狗继承自动物)。对于每个 class 我都有一个方法(受保护)foo
具有相同的签名。这些方法应该是常规方法,非虚拟方法。但是由于 PHP 使所有非私有方法成为虚拟方法,现在我遇到了问题。
在我开始写一些解决方法之前,也许可以用更简单的方法解决它。即:
是否可以在 PHP 中将方法标记为非虚拟方法?
"sitting" inside given class (Animal or Dog) 是否可以在 current[=26= 的上下文中调用 foo
] class,所以虚拟机制不会启动?
您可以将方法标记为 final:
class foo {
final protected function bar() {} //can not be overriden
}
或者甚至将 class 标记为最终:
final class foo { // can not be extended
//...
}
您可以将 self
关键字与方法调用结合使用,以在当前 class:
的上下文中调用方法
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
假设我有 class 动物和狗(狗继承自动物)。对于每个 class 我都有一个方法(受保护)foo
具有相同的签名。这些方法应该是常规方法,非虚拟方法。但是由于 PHP 使所有非私有方法成为虚拟方法,现在我遇到了问题。
在我开始写一些解决方法之前,也许可以用更简单的方法解决它。即:
是否可以在 PHP 中将方法标记为非虚拟方法?
"sitting" inside given class (Animal or Dog) 是否可以在 current[=26= 的上下文中调用
foo
] class,所以虚拟机制不会启动?
您可以将方法标记为 final:
class foo {
final protected function bar() {} //can not be overriden
}
或者甚至将 class 标记为最终:
final class foo { // can not be extended
//...
}
您可以将 self
关键字与方法调用结合使用,以在当前 class:
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