call_user_func_array是个很神奇的函数,在你PHP水平成长到一定高度的时候,你就能深刻理解它的意义了。这里我给你举两个适合用call_user_func_array的例子,帮助你理解
场景一:参数数目不确定
函数的参数是用户传入的,而且参数的数目不确定。如果不用call_user_func_array你会怎么做?一些PHP框架可以将$_GET参数自动映射到方法,就是这样实现的。
场景二:用于函数回调
回调函数可能是一个普通函数,可能是类方法,也可能是静态方法。如果使用call_user_func_array,你就不用去判断方法的类型。
普通方法和静态方法, 都可以通过 类名::方法名调用啊 ,只不过普通方法貌似很少这么干的?
参数不确定 ,php不是有func_get_args()方法可以接受全部的参数数组吗?
这是一个设计上的问题。func_get_args是可以实现,但这就要求编写函数的用户有要实现更多的逻辑。
如果你是一个框架的设计者,你要用户自己写func_get_args,自己写参数处理的过程吗?
有时这个函数是来自某个类库的,难道你要修改源码么?
给你一个回调函数的例子,如果不用call_user_func_array要写多少代码?
1 2 3 4 5 6 7 |
<?php function call_func(callback){ return call_user_func_array(callback, array(1,2)); } call_func(array($obj, 'method')); call_func(array('classname', 'method')); call_func('simple_function'); |
demo
1 2 3 4 5 6 7 8 9 10 |
Class ClassA { function bc($b, $c) { $bc = $b + $c; echo $bc; } } call_user_func_array(array('ClassA','bc'), array("111", "222")); //显示 333 ?> |
call_user_func_array最后的例子是错哦,你用bc方法去调用类里 另外一个方法就知道问题所在了。情况1.调用非静态方法 第一个参数应该传[类的实例,调用方法] (既然有类实例了直接->调用就很方便了。。。)情况2.调用静态方法 第一个参数传[类名|类实例,调用方法]上面的举例函数回调完全可以$callback($arg)这样执行。所以这个函数的用途只有在参数不确定的时候使用,是一个很老的函数了。当然我觉得写一个方法最好让参数能相对的确定下来,这样不容易出各种各样的问题。
是的,参数不确定太难控制