4

标题有点混乱,我知道,但这是我能做的最好的。=P

希望有人能够提供帮助。

我正在使用 CodeIgniter,并且我在具有多个参数的基类中有一个方法:

class MY_Base extends CI_Model {

    function some_function($param1, $param2 ... $param8) {
        // do stuff
    }
}

我想要做的基本上是这个,在一个子类中:

class Child extends MY_Base {

    function some_function($param1, $param2 ... $param8) {
        parent::some_function($param1, $param2 ... $param8);
        // call a methods found in this class only
        $this->some_method();
    }

    function some_method() {
        // do more stuff
    }
}

我不能触及基类,所以我必须从它扩展。问题是,参数太多了。这也发生在不同的方法中,有时我会忘记一种导致代码失败的方法。

所以我想知道,是否有办法这样写:

function some_function(__PARAMETERS__) {
    parent::some_function(__PARAMETERS__)
}

我似乎隐约记得这是可能的,但我在 Google 中找不到。可能是因为我搜索了错误的关键字。

任何帮助,将不胜感激。

编辑:然后,当然,我func_get_args()在发布这个问题后发现。这似乎符合我的要求,但我会留下这个问题以获得更好的想法。

4

4 回答 4

8

对于 PHP >=7.0,我使用:

parent::{__FUNCTION__}(...func_get_args())
于 2017-07-13T08:03:31.800 回答
7
function some_function($a, $b, $c) {
    call_user_func_array('parent::some_function', func_get_args());
}

警告:PHP >= 5.3

甚至:

function some_function($a, $b, $c) {
    call_user_func_array('parent::' . __FUNCTION__, func_get_args());
}
于 2012-05-16T09:09:19.617 回答
0

callParent()您可以在最父类中声明以下方法

/**
 * Calls the parent class's same function, passing same arguments.
 * This is similar to ExtJs's callParent() function, except that agruments are 
 * FORCED to be passed (in extjs, if you call this.callParent() - no arguments would be passed,
 * unless you use this.callParent(arguments) expression instead)
 */
function callParent() {

    // Get call info from backtrace
    $call = array_pop(array_slice(debug_backtrace(), 1, 1));

    // Make the call
    call_user_func_array(get_parent_class($call['class']) . '::' . $call['function'], $call['args']);
}

所以,在你的子类方法中,如果你想调用父方法,你可以使用

$this->callParent(); 

代替

call_user_func_array('parent::' . __FUNCTION__, func_get_args());

表达

于 2014-12-31T13:35:51.340 回答
0

您可以使用call_user_func_array()函数调用它。

例如:

 <?php
 function some_function($var1, $var2, $var3)
 {
    call_user_func_array('parent::'.__METHOD__, func_get_args());
 }
 ?>
于 2012-05-16T09:10:46.333 回答