【发布时间】:2012-10-18 03:37:26
【问题描述】:
让我们看一个基本类:
class A
{
public function renderSomethingRecursive()
{
//this function can call itself
self::renderSomethingRecursive(); // ERROR!!!!
}
abstract public function addSomething (value);
}
class B extends A
{
public function renderSomethingRecursive()
{
throw new Exception ('This time this method must not be called!');
}
public function addSomething (value)
{
//something, something, something....
parent::renderSomethingRecursive();
}
}
$obj = new B();
$obj->addSomething(....);
当我这样做时,B::renderSomethingRecursive() 仍然会被调用,这是我不想要的……在A:renderSomethingRecursive() 方法上,在self::renderSomethingRecursive(); // ERROR!!!! 行调用B::renderSomethingRecursive(); 而不是 A::renderSomethingRecursive();,这是合理的,因为 $this 现在是 B 而不是 A... 但是我不知道如何躲避它。
顺便说一句,我知道 B::renderSomethingRecursive() 方法应该被删除,但我想保留它作为一个通知,它不能被意外调用。我想将其设为“私有”以使其不可用,但正如我们所知,这是不可能的:)
有什么想法吗?
【问题讨论】:
-
无法重现——您的代码从不调用
B::renderSomethingRecursive()(我只对其进行了足够的修改以使其运行,即删除value,将A声明为abstract等)。 -
我也无法复制。你有什么问题?
-
请贴出实际代码,由于语法错误,此代码无法运行。它不应该从 B 运行方法,所以你显然做错了什么,但没有用这段代码显示它。
标签: php oop polymorphism virtual-functions