繁体   English   中英

使用各种参数列表从子方法调用父方法

[英]Call parent method from child method using various argument list

假设以下情况。 有一些类层次结构,它在方法中使用各种参数列表,并且可能会为每个后代类扩展。

<?php
header('Content-Type: text/plain; charset=utf-8');

class A {
    public function __invoke(){
        $arguments = implode(', ', func_get_args());

        echo __METHOD__, ' arguments: ', $arguments, PHP_EOL;
    }
}

class B extends A {
    public function __invoke(){
        //               ... some actions ...
        // call to parent method with current argument list
        //               ... some actions ...
    }
}
?>

如果此类的层次结构是通过__invoke()方法的固定参数实现的,那么我可能会使用类似于parent::__invoke($a, $b, $c, $etc); 实现我的目的。 但是,不幸的是,类AB都具有某些功能,这些功能依赖于各种参数列表。

现在,问题是: 如何从B::__invoke()调用parent::__invoke() B::__invoke()并传递其参数列表?

而且,是的,我将使其变得更加复杂:我不能依赖父类的实际名称,因为链可能会进一步扩展。

PS:我只想在某处提及此事,因为这件事几乎挽救了我的生命。

有两种方法可以实现,其中一种对我来说很明显: 使用Reflection

  1. 从类A创建一个ReflectionClass ;

  2. 使用ReflectionClass::getParentClass()方法获取最近的反射父级;

  3. 通过ReflectionClass::getMethod()方法获取父类的__invoke()方法反射;

  4. 使用ReflectionMethod::invokeArgs()方法通过func_get_args()函数调用父方法来传递当前参数列表。

但是,我在想,使用此功能进行单个函数调用可能会过分(!)。 因此,我考虑了另一种方法: 古老而强大的call_user_func_array()函数和get_parent_class()函数

  1. 使用get_parent_class()函数获取父类;

  2. 获取当前的方法名称(我想用__METHOD__恒定的,但它总是呈现出类的前缀,在方法声明)与__FUNCTION__常数;

  3. 使用方法map调用call_user_func_array()并传递func_get_args()作为第二个参数。


解:

<?php
header('Content-Type: text/plain; charset=utf-8');

class A {
    public function __invoke(){
        $arguments = implode(', ', func_get_args());

        echo __METHOD__, ' arguments: ', $arguments, PHP_EOL;
    }
}

class B extends A {
    public function __invoke(){
        echo __METHOD__, ' actions', PHP_EOL;

        $method = array(get_parent_class($this), __FUNCTION__);
        $result = call_user_func_array($method, func_get_args());

        echo __METHOD__, ' actions', PHP_EOL;
    }
}

$test = new B();

$test(1, 2, 3);
?>

结果:

B::__invoke actions
A::__invoke arguments: 1, 2, 3
B::__invoke actions

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM