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

我可以在PHP中调用没有名称的继承父方法吗?,php,inheritance,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

有没有一种方法可以调用继承的方法,而不指定其函数名

比如:

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\u backtrace()
,获取调用inherit()的最后一个函数,并使用相同的函数名访问它的父函数。我想知道是否有更好的方法来代替使用调试函数,而调试函数显然不适用于此。

您可以使用

而不是

call_user_func(array('parent', __FUNCTION__));  
你也可以

parent::{__FUNCTION__}();

动态调用函数:

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();
脏的,但是:

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()的父方法


我可以问一下你为什么要这么做吗?当然。我没有任何限制或非常“纯粹”的理由,我只是觉得重复方法名是多余的,特别是当它可能很长,而且也是任意的(由开发人员选择,可能是拼写错误和键入错误等)。我发现只“继承()”它更自然,就像在许多其他语言中一样。当您更改方法名称时,也会更容易一些,您不必为每个子级更改两次。我认为关键是调用parent::some_function(),而不必放置某些_function()。我不确定LSB在这里会有帮助。@Gordon好的,我已经把答案扩展到动态电话。谢谢,但这仍然不是OP想要的。他首先不知道如何获取$functionName,静态::$foo()将不会调用父对象。好的,我将撤销下一票,尽管您在问题中留下了不相关的内容。我将其保留,因为它似乎无意中破坏了静态方法和继承类的用途。谢谢@Gordon。我接受了你的答案,尽管从调试的角度来看,我发现它和我原来的选项一样“误导”。这样的代码很难调试,从长远来看可能会造成比它解决的问题更多的麻烦。然而,这是一个很好的答案。谢谢@乔治:谢谢,但调试有多困难<代码>父项::{uuuuu函数\ uuuu}()与编写
parent::some_function()
相同,只是PHP为您输入了方法名。这与编写
inherit()
super()
有多大不同?我认为在多个开发人员处理同一代码的环境中,有时您会对PHP的这些“神奇”增强感到非常厌倦。调用不存在的方法、魔常量、魔getter和setter等等,它们都很难通过简单的代码外观检查进行调试,并且可能会产生误导-大多数时候,您必须运行代码并查看常量中包含的内容。我在这里谈论的是一种通用的方法,而不是这个特定的实例,正如您所说的那样,它是相当可读的
父:{uuuu函数{uuuu}()
,这就是我接受它的原因。@George,嗯,同意。魔术总是很难看穿的。虽然有了这些神奇的常量,实际上只是PHP在解析类时替换了它们,所以它们是非常可预测的,因为它们不依赖于运行时信息。与魔术不同,魔术确实需要你知道当前的执行状态。谢谢马克,你的答案与上面的@Gordon非常相似,但我从一开始就接受了他的答案。您的答案还添加了一个小的(极不可能的)可能的bug,假设
explode(\uuuu METHOD\uuu)
函数将返回至少包含两个条目的数组,这不是一个安全的假设。
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();
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();