call_user_func_array (callable $callback, array $param_arr)

參数1: 调用一个回调函数,

參数2: 数组參数是回调函数的參数.

call_user_func(callable $callback, $mixed $parameter, $mixed $...)

參数1:调用的回调函数

參数2-n:回调函数的參数.

比較这两者的不同哦. 前者的第二个參数必须是 数组.

情况一:调用普通的函数.

  1. <?
  2.  
  3. php
  4. function barber($type)
  5. {
  6. echo "You wanted a $type haircut, no problem\n";
  7. }
  8. call_user_func('barber', "mushroom");
  9. call_user_func('barber', "shave");
  10. ?>

这里,第一个參数直接指定函数的名称.

  1. <?
  2.  
  3. php
  4. function barber($type)
  5. {
  6. echo "You wanted a $type haircut, no problem\n";
  7. }
  8. call_user_func_array('barber', array("mushroom"));
  9. call_user_func_array('barber', array("shave"));
  10. ?>

还是比較一下这两者之间的不同.

看出来的请继续.

情况二: 调用类中的静态函数.

以下是call_user_func_arr

  1. namespace Foo;
  2. class F {
  3. public static function showName ($name) {
  4. return strtoupper($name);
  5. }
  6. }
  7. echo call_user_func_array(__NAMESPACE__.'\F::showName', array('vein'));
  8. echo call_user_func_array(array(__NAMESPACE__.'\F', 'showName'), array('vein'));
  9. $f = new F();
  10. echo call_user_func_array(array($f, 'showName'), array('vein'));

以下是call_user_func

  1. namespace Foo;
  2. class F {
  3. public static function showName ($name) {
  4. return strtoupper($name);
  5. }
  6. }
  7. echo call_user_func(__NAMESPACE__ . '\F::showName','vein');
  8. echo call_user_func(array(__NAMESPACE__ . '\F','showName'),'vein');
  9.  
  10. $f = new F();
  11. echo call_user_func(array($f, 'showName'),'vein');

情况三:动态方法调用

call_user_func

  1. namespace Foo;
  2. class F {
  3. public function showAge ($age) {
  4. return $age + 100;
  5. }
  6. }
  7. call_user_func(__NAMESPACE__ . '\F::showAge',23);

这里要注意一点,假设这样调用的话,系统会报错,提示

call_user_func() expects parameter 1 to be a valid callback, non-static method Foo\F::showAge() should not be called s

tatically

解释一下: 这个函数的第一个參数必须是 有效的回调函数, 非静态的方法showAge() 是不同意调用的.

须要的解决方式是:

  1. namespace Foo;
  2. class F {
  3. public static function showName ($name) {
  4. return strtoupper($name);
  5. }
  6.  
  7. public function showAge ($age) {
  8. return $age + 100;
  9. }
  10. }
  11. $f = new F();
  12. echo call_user_func(array($f, 'showAge'),23);

对于这种动态函数的调用,必须提前进行对象实例化,

然后将实例化之后的对象传入函数作为第一个參数.

call_user_func_array :

  1. namespace Foo;
  2. class F {
  3. public static function showName ($name) {
  4. return strtoupper($name);
  5. }
  6.  
  7. public function showAge ($age) {
  8. return $age + 100;
  9. }
  10. }
  11. $f = new F();
  12. echo call_user_func_array(array($f, 'showAge'),array(23));

这样也是可行的.

总结一下: call_user_func_array 和 call_user_func 两个函数基本上是类似的,仅仅是在调用上传递參数时存在一些差异.

记住一点,call_user_func_array 传递的第二个參数必须是数组,

call_user_func 传递的第二个參数可能是数组.假设是多个參数的话,还是须要以列表的形式列出.

PHP 函数之 call_user_func &amp; call_user_func_array的更多相关文章

  1. php函数: call_user_func()和call_user_func_array() 使用详解

    call_user_func 该函数允许直接调用自己写的函数,可以直接传入一些参数. 使用方法1:给自己写的函数传入参数,一个特别的调用函数的方法. <?php funciotn test1($ ...

  2. PHP函数call_user_func和call_user_func_array详解

    今天在群里面,有个叫lewis的在问call_user_func_array的用法,因为之前一直没有用过,也不能说什么,于是看一下手册,发现是这么写的: call_user_func_array (P ...

  3. 简单理解call_user_func和call_user_func_array两个函数

    call_user_func():调用一个回调函数处理字符串, 可以用匿名函数,可以用有名函数,可以传递类的方法, 用有名函数时,只需传函数的名称 用类的方法时,要传类的名称和方法名 传递的第一个参数 ...

  4. php自定义函数call_user_func和call_user_func_array详解

    看UCenter的时候有一个函数call_user_func,百思不得其解,因为我以为是自己定义的函数,结果到处都找不到,后来百度了一下才知道call_user_func是内置函 call_user_ ...

  5. php回调函数call_user_func和call_user_func_array详解

    call_user_func($fun); call_user_func 函数类似于一种特别的调用函数的方法,使用方法如下: 1.调用 普通函数: <?php function a($b, $c ...

  6. PHP回调函数call_user_func()和call_user_func_array()的使用

    call_user_func():把第一个参数作为回调函数调用 用法:call_user_func ( callable $callback [, mixed $parameter [, mixed ...

  7. php call_user_func和call_user_func_array

    首先要看这个页面关于callable类型:http://www.php.net/manual/zh/language.types.callable.php 自 PHP 5.4 起可用 callable ...

  8. call_user_func 和 call_user_func_array用法

    说明 call_user_func 和 call_user_func_array 相同:都可以调用函数和类内部的函数,不同:不同的是传递的参数不同,前者是一个参数一个参数传递, 后者是传递array参 ...

  9. php中call_user_func 与 call_user_func_array的使用

    call_user_func()是利用回调函数处理字符串,call_user_func_array是利用回调函数处理数组. // 1. 调用自定义函数 function test($a, $b) { ...

随机推荐

  1. linux CentOS 上安装chrome

    1.wget http://chrome.richardlloyd.org.uk/install_chrome.sh   (用wget下载shell文件)2.chmod u+x install_chr ...

  2. Java学习(一)Scanner报错java.util.NoSuchElementException

    我在一个方法A中使用了Scanner的 Scanner input=new Scanner(System.in),随后又将其关闭了,因为Eclipse里面你若不关闭,他会有一个warning:Reso ...

  3. hive(七)hive-运行方式、GUI接口、权限管理

    1.Hive运行方式: 命令行方式cli:控制台模式 脚本运行方式(实际生产环境中用最多) JDBC方式:hiveserver2 web GUI接口 (hwi.hue等)   1.1Hive在CLI模 ...

  4. Android学习笔记(四) 定时器Timer

    Android考虑到线程安全问题,不允许在线程中执行UI线程. 所以在线程中不允许有UI操作 可以利用Handler机制来接收Timer每隔一秒发出的信息,也可以直接利用handler机制的 1.方法 ...

  5. NIO-4pipe

    import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.Pipe; import org.ju ...

  6. SGU 209. Areas

    209. Areas time limit per test: 0.25 sec.memory limit per test: 65536 KB input: standardoutput: stan ...

  7. hdu4347

    求与询问点欧几里德距离前m小的点 其实就是在kdtree询问的时候用优先队列维护一下就好了 好久没写kdtree练一练,注意这道题是多测 #include<bits/stdc++.h> u ...

  8. Docker数据卷和Docker系统管理(二)

    一. 在镜像中定义卷 1. Dockerfile中定义卷的案例 VOLUME /app/data VOLUME /app/data, /app/profiles, /app/config VOLUME ...

  9. 【C#】IEnumrator的枚举数和IEnumerable接口

    声明IEnumerator的枚举数 要创建非泛型接口的枚举数,必须声明实现IEnumerator接口的类,IEnumerator接口有如下特性: 1.她是System.Collections命名空间的 ...

  10. 转:xxe attack学习

    小结 1.http包发送类型:content-type:text/xml2.xxe漏洞非常危险, 因为此漏洞会造成服务器上敏感数据的泄露,和潜在的服务器拒绝服务攻击.要去校验DTD(document ...