通过类层次结构递归调用方法

时间:2015-04-14 16:00:25

标签: php oop

我想以递归方式调用父方法:

<?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

1 个答案:

答案 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上定义。 generation3generation4依赖于他们的祖先的定义,因此实际上并没有在他们的上下文中调用(这就是为什么你只看到两个输出,只有两个方法被调用)

你可以通过在每个级别定义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}对于其他一些可能性。

相关问题