Php 动态函数参数和使用_调用

Php 动态函数参数和使用_调用,php,php-5.3,Php,Php 5.3,前提是: 我有很多类,在调用任何类中的任何方法之前,我需要执行一个操作,我的解决方案是让所有类扩展一个父类,该父类将定义一个call()函数,该函数如下所示: public function call($method){ //do the something I need to do before method calls $params = func_get_args(); //remove the $method param from the $params arra

前提是:

我有很多类,在调用任何类中的任何方法之前,我需要执行一个操作,我的解决方案是让所有类扩展一个父类,该父类将定义一个call()函数,该函数如下所示:

public function call($method){
    //do the something I need to do before method calls
    $params = func_get_args();
    //remove the $method param from the $params array
    unset($params[0]);
    return $this->__call($method,$params);
}
然后简单地调用call方法并指定我想要调用的实际方法,这样方法将被调用,但在call方法(类从父类继承)内部,我可以在调用指定方法之前执行需要执行的操作

这需要能够支持可以是数组或字符串的参数,因此任何涉及到内爆参数数组的操作都不会起作用(因为这将假定所有参数都是字符串)

我不确定我上面所说的是否有意义,我想检查一下,看看我是否走错了路

如有任何想法,将不胜感激

谢谢


PS:我应该注意到,我对上述情况的描述听起来好像子类扩展父类的原因就是为了这个目的,实际上还有更多的原因(我的父类扩展了Zend_Db_Table_Abstract,我的数据库模型扩展了父类).

我更好/更干净的选择可能是设置事件和侦听系统,如。(该代码实际上来自公共库,而不是ORM部分。)但您将需要所有方法来分派事件


我尽量避免使用uu调用,因为这会使代码更难理解和维护,尽管我认为在插件系统中使用也不错。

\uu调用
在您尝试调用不存在的函数时,如果已定义,则会自动调用。这就是为什么它是一种“神奇”的方法。在我看来,直接使用它,而不是在它所要使用的上下文中使用它似乎很奇怪。在这里,你不妨给它起个名字

在这里,您完全可以利用
\u call
的强大功能。尝试在所有成员函数之前使用下划线命名它们。因此,如果您以前有
$this->print()
,您现在就有了
$this->\u print()
。然后,在
\u调用
函数中,添加下划线,并使用
调用用户函数函数数组(数组($this,“\u$name”),$params)
调用函数。现在您可以正常调用函数了(好吧,不用下划线)


尽管如此,我还是不建议使用
\u call
,除非是为了方便起见。从长远来看,最好直接调用您想要运行的任何代码。

谢谢您的建议,我有点误入歧途,但我提出了以下解决方案:

public function call($method){
    //do the something I need to do before method calls
    $params = func_get_args();
    //remove the $method param from the $params array
    unset($params[0]);
    return call_user_func_array(array($this,$method),$params);
}

再次感谢各位

您可以直接从调用参数中获取方法参数:

function __call($method, $args) {
    return call_user_func_array(array($this,$method),$args);
}

是的,我意识到在一些篡改后,它并不是被设计成我试图使用它的方式。我想我的实际问题是能够将一个混合值数组(一些数组、一些字符串等)作为单独的参数传递给被调用的方法。什么会阻止您将一个混合值数组作为参数传递?这不正是
call\u user\u func
的作用吗?不是call\u user\u func,而是call\u user\u func\u数组,前者只是将参数数组作为单个参数(数组)传递,后者解决了我的问题,感谢您朝着正确的方向努力!啊,对了,我错了(凭记忆工作)。我想我应该在我的答案中更正:)我想技术上来说,现在你已经编辑了它,我使用了你的答案,所以我会给你接受的答案:p