我想以递归方式调用父方法:
<?php
class generation1 {
public function whoami() {
echo get_class($this).PHP_EOL;
}
public function awesome() { // stop recursion
$this->whoami();
}
}
class generation2 extends generation1 {
public function awesome() {
$this->whoami();
parent::awesome();
}
}
class generation3 extends generation2 {}
class generation4 extends generation3 {}
$gen = new generation4();
$gen->awesome();
输出结果为:
generation4
generation4
我想:
generation4
generation3
第二代
generation1
答案 0 :(得分:2)
__CLASS__
魔术常量不会被解释为实例 的具体类,而是计算为常量包含的类名英寸
如果您想获取具体的类名(而不是基类名),请尝试使用get_class()
。
<?php
class A
{
public function test1()
{
echo __CLASS__ . "\n";
}
public function test2()
{
echo get_class($this) . "\n";
}
}
class B extends A {}
$b = new B;
$b->test1();
$b->test2();
输出:
A
乙
<强>更新强>
在您的特定情况下,只有两个 awesome
方法;一个在generation2
上定义,一个在generation1
上定义。 generation3
和generation4
依赖于他们的祖先的定义,因此实际上并没有在他们的上下文中调用(这就是为什么你只看到两个输出,只有两个方法被调用)
你可以通过在每个级别定义awesome
方法来解决这个问题。麻烦就是$this->whoami()
行。每个上下文中的$this
指的是generation4
对象的具体实例,因此即使在generation2
级别,在awesome方法内部调用$this->whoami()
也会导致该方法在generation4
上从所有awesome
方法调用。
您也可以通过将$this
更改为self
来解决此限制。我能想出的最终解决方案是:
class gen1
{
public function whoami()
{
echo __CLASS__ . PHP_EOL;
}
public function awesome()
{
self::whoami();
}
}
class gen2 extends gen1 {
public function whoami()
{
echo __CLASS__ . PHP_EOL;
}
public function awesome()
{
self::whoami();
parent::awesome();
}
}
class gen3 extends gen2 {
public function whoami()
{
echo __CLASS__ . PHP_EOL;
}
public function awesome()
{
self::whoami();
parent::awesome();
}
}
class gen4 extends gen3 {
public function whoami()
{
echo __CLASS__ . PHP_EOL;
}
public function awesome()
{
self::whoami();
parent::awesome();
}
}
$gen4 = new gen4;
$gen4->awesome();
其输出为:
GEN4
GEN3
2代
GEN1
你可能能够解决其中一些限制如果你安装了PHP 5.5(我现在只在本地使用5.4,无法测试),但请参阅{{3}对于其他一些可能性。