我可以在PHP中调用没有名称的继承父方法吗?

时间:2013-07-30 13:06:41

标签: php inheritance

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

类似的东西:

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;
    }
}

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

3 个答案:

答案 0 :(得分:5)

您可以使用magic __FUNCTION__ constant.

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__}();

答案 1 :(得分: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();

答案 2 :(得分:0)

动态调用函数:

static::$functionName();

在你的情况下:

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

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


从长远来看,你的问题可能会引导你走向其他的东西。

查看late static binding这就是您要找的内容。

从链接页面获取的示例。

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();