2

有没有办法调用继承的方法,而不指定它的函数名?

就像是:

class Child extends Parent {
    function some_function(){
        // magically inherit without naming the parent function
        // it will call parent::some_function()
        parent::inherit();

        // other code
    }

    function another_function(){
        // it will call parent::another_function()
        $result = parent::inherit();

        // other code
        return $result;
    }
}

我可以想到一个hack来使用debug_backtrace(),获取调用inherit()的最后一个函数并使用相同的函数名访问它的父函数。我想知道是否有更好的方法来代替使用显然不适合此的调试功能。

4

3 回答 3

6

您可以使用魔法__FUNCTION__常数。

class A 
{
    function some_function()
    {
        echo 'called ' . __METHOD__;
    }
}

class B extends A 
{
    function some_function()
    {
        call_user_func(array('parent', __FUNCTION__));           
    }
}

 $b = new B;
 $b->some_function(); // prints "called A::some_function"

代替

call_user_func(array('parent', __FUNCTION__));  

你也可以

parent::{__FUNCTION__}();
于 2013-07-30T13:10:55.000 回答
1

脏,但是:

class Adult {
    function mummy(){
        return 'Walk like an Egyptian';
    }

    function daddy(){
        return 'Luke, I am your father';
    }
}


class Child extends Adult {
    function mummy(){
        echo 'Mummy says: ';
        $me = explode('::',__METHOD__)[1];
        echo parent::$me();
    }

    function daddy(){
        echo 'Daddy says: ';
        $me = explode('::',__METHOD__)[1];
        echo parent::$me();
    }
}

$o = new Child();
$o->mummy();
$o->daddy();

编辑

实际上给了你一个名为inherit()的父方法;

class Adult {
    private function mummy(){
        return 'Walk like an Egyptian';
    }

    private function daddy(){
        return 'Luke, I am your father';
    }

    protected function inherit($method) {
        $beneficiary = explode('::', $method)[1];
        return $this->$beneficiary();
    }
}


class Child extends Adult {
    public function mummy() {
        echo 'Mummy says: ', 
            parent::inherit(__METHOD__), 
            PHP_EOL;
    }

    public function daddy() {
        echo 'Daddy says: ', 
            parent::inherit(__METHOD__), 
            PHP_EOL;
    }
}

$o = new Child();
$o->mummy();
$o->daddy();
于 2013-07-30T13:15:14.157 回答
0

动态调用函数:

static::$functionName();

在你的情况下:

$func = __FUNCTION__;
parent::$func();

注意:函数名必须是字符串,如果是实际函数(在此上下文中并不真正相关),则首先需要先将其转换为其字符串名。


从长远来看,您的问题可能会引导您解决其他问题。

查看后期静态绑定,这就是您要寻找的。

示例取自链接页面。

class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        static::who(); // Here comes Late Static Bindings
    }
}

class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}

B::test();

于 2013-07-30T13:13:21.183 回答