PHP 函数之 call_user_func & call_user_func_array
call_user_func_array (callable $callback, array $param_arr)
參数1: 调用一个回调函数,
參数2: 数组參数是回调函数的參数.
call_user_func(callable $callback, $mixed $parameter, $mixed $...)
參数1:调用的回调函数
參数2-n:回调函数的參数.
比較这两者的不同哦. 前者的第二个參数必须是 数组.
情况一:调用普通的函数.
- <?
- php
- function barber($type)
- {
- echo "You wanted a $type haircut, no problem\n";
- }
- call_user_func('barber', "mushroom");
- call_user_func('barber', "shave");
- ?>
这里,第一个參数直接指定函数的名称.
- <?
- php
- function barber($type)
- {
- echo "You wanted a $type haircut, no problem\n";
- }
- call_user_func_array('barber', array("mushroom"));
- call_user_func_array('barber', array("shave"));
- ?>
还是比較一下这两者之间的不同.
看出来的请继续.
情况二: 调用类中的静态函数.
以下是call_user_func_arr
- namespace Foo;
- class F {
- public static function showName ($name) {
- return strtoupper($name);
- }
- }
- echo call_user_func_array(__NAMESPACE__.'\F::showName', array('vein'));
- echo call_user_func_array(array(__NAMESPACE__.'\F', 'showName'), array('vein'));
- $f = new F();
- echo call_user_func_array(array($f, 'showName'), array('vein'));
以下是call_user_func
- namespace Foo;
- class F {
- public static function showName ($name) {
- return strtoupper($name);
- }
- }
- echo call_user_func(__NAMESPACE__ . '\F::showName','vein');
- echo call_user_func(array(__NAMESPACE__ . '\F','showName'),'vein');
- $f = new F();
- echo call_user_func(array($f, 'showName'),'vein');
情况三:动态方法调用
call_user_func
- namespace Foo;
- class F {
- public function showAge ($age) {
- return $age + 100;
- }
- }
- 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() 是不同意调用的.
须要的解决方式是:
- namespace Foo;
- class F {
- public static function showName ($name) {
- return strtoupper($name);
- }
- public function showAge ($age) {
- return $age + 100;
- }
- }
- $f = new F();
- echo call_user_func(array($f, 'showAge'),23);
对于这种动态函数的调用,必须提前进行对象实例化,
然后将实例化之后的对象传入函数作为第一个參数.
call_user_func_array :
- namespace Foo;
- class F {
- public static function showName ($name) {
- return strtoupper($name);
- }
- public function showAge ($age) {
- return $age + 100;
- }
- }
- $f = new F();
- 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 & call_user_func_array的更多相关文章
- php函数: call_user_func()和call_user_func_array() 使用详解
call_user_func 该函数允许直接调用自己写的函数,可以直接传入一些参数. 使用方法1:给自己写的函数传入参数,一个特别的调用函数的方法. <?php funciotn test1($ ...
- PHP函数call_user_func和call_user_func_array详解
今天在群里面,有个叫lewis的在问call_user_func_array的用法,因为之前一直没有用过,也不能说什么,于是看一下手册,发现是这么写的: call_user_func_array (P ...
- 简单理解call_user_func和call_user_func_array两个函数
call_user_func():调用一个回调函数处理字符串, 可以用匿名函数,可以用有名函数,可以传递类的方法, 用有名函数时,只需传函数的名称 用类的方法时,要传类的名称和方法名 传递的第一个参数 ...
- php自定义函数call_user_func和call_user_func_array详解
看UCenter的时候有一个函数call_user_func,百思不得其解,因为我以为是自己定义的函数,结果到处都找不到,后来百度了一下才知道call_user_func是内置函 call_user_ ...
- php回调函数call_user_func和call_user_func_array详解
call_user_func($fun); call_user_func 函数类似于一种特别的调用函数的方法,使用方法如下: 1.调用 普通函数: <?php function a($b, $c ...
- PHP回调函数call_user_func()和call_user_func_array()的使用
call_user_func():把第一个参数作为回调函数调用 用法:call_user_func ( callable $callback [, mixed $parameter [, mixed ...
- php call_user_func和call_user_func_array
首先要看这个页面关于callable类型:http://www.php.net/manual/zh/language.types.callable.php 自 PHP 5.4 起可用 callable ...
- call_user_func 和 call_user_func_array用法
说明 call_user_func 和 call_user_func_array 相同:都可以调用函数和类内部的函数,不同:不同的是传递的参数不同,前者是一个参数一个参数传递, 后者是传递array参 ...
- php中call_user_func 与 call_user_func_array的使用
call_user_func()是利用回调函数处理字符串,call_user_func_array是利用回调函数处理数组. // 1. 调用自定义函数 function test($a, $b) { ...
随机推荐
- linux CentOS 上安装chrome
1.wget http://chrome.richardlloyd.org.uk/install_chrome.sh (用wget下载shell文件)2.chmod u+x install_chr ...
- Java学习(一)Scanner报错java.util.NoSuchElementException
我在一个方法A中使用了Scanner的 Scanner input=new Scanner(System.in),随后又将其关闭了,因为Eclipse里面你若不关闭,他会有一个warning:Reso ...
- hive(七)hive-运行方式、GUI接口、权限管理
1.Hive运行方式: 命令行方式cli:控制台模式 脚本运行方式(实际生产环境中用最多) JDBC方式:hiveserver2 web GUI接口 (hwi.hue等) 1.1Hive在CLI模 ...
- Android学习笔记(四) 定时器Timer
Android考虑到线程安全问题,不允许在线程中执行UI线程. 所以在线程中不允许有UI操作 可以利用Handler机制来接收Timer每隔一秒发出的信息,也可以直接利用handler机制的 1.方法 ...
- NIO-4pipe
import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.Pipe; import org.ju ...
- SGU 209. Areas
209. Areas time limit per test: 0.25 sec.memory limit per test: 65536 KB input: standardoutput: stan ...
- hdu4347
求与询问点欧几里德距离前m小的点 其实就是在kdtree询问的时候用优先队列维护一下就好了 好久没写kdtree练一练,注意这道题是多测 #include<bits/stdc++.h> u ...
- Docker数据卷和Docker系统管理(二)
一. 在镜像中定义卷 1. Dockerfile中定义卷的案例 VOLUME /app/data VOLUME /app/data, /app/profiles, /app/config VOLUME ...
- 【C#】IEnumrator的枚举数和IEnumerable接口
声明IEnumerator的枚举数 要创建非泛型接口的枚举数,必须声明实现IEnumerator接口的类,IEnumerator接口有如下特性: 1.她是System.Collections命名空间的 ...
- 转:xxe attack学习
小结 1.http包发送类型:content-type:text/xml2.xxe漏洞非常危险, 因为此漏洞会造成服务器上敏感数据的泄露,和潜在的服务器拒绝服务攻击.要去校验DTD(document ...