php call_user_func和call_user_func_array
首先要看这个页面关于callable类型:http://www.php.net/manual/zh/language.types.callable.php
自 PHP 5.4 起可用 callable 类型指定回调类型 callback。本文档基于同样理由使用 callback 类型信息。
一些函数如 call_user_func() 或 usort() 可以接受用户自定义的回调函数作为参数。回调函数不止可以是简单函数,还可以是对象的方法,包括静态类方法。
传递
一个 PHP 的函数以 string 类型传递其名称。可以使用任何内置或用户自定义函数,但除了语言结构例如: array(), echo, empty(), eval(), exit(), isset(), list(), print或 unset()。
一个已实例化的对象的方法被作为数组传递,下标 0 包含该对象,下标 1 包含方法名。
静态类方法也可不经实例化该类的对象而传递,只要在下标 0 中包含类名而不是对象。自 PHP 5.2.3 起,也可以传递 'ClassName::methodName'。
除了普通的用户自定义函数外, create_function() 可以用来创建一个匿名回调函数。自 PHP 5.3.0 起也可传递 closure 给回调参数。
<?php // An example callback function
function my_callback_function() {
echo 'hello world!';
} // An example callback method
class MyClass {
static function myCallbackMethod() {
echo 'Hello World!';
}
} // Type 1: Simple callback
call_user_func('my_callback_function'); // Type 2: Static class method call
call_user_func(array('MyClass', 'myCallbackMethod')); // Type 3: Object method call
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod')); // Type 4: Static class method call (As of PHP 5.2.3)
call_user_func('MyClass::myCallbackMethod'); // Type 5: Relative static class method call (As of PHP 5.3.0)
class A {
public static function who() {
echo "A\n";
}
} class B extends A {
public static function who() {
echo "B\n";
}
} call_user_func(array('B', 'parent::who')); // A
?>
使用 Closure 的示例
<?php
// Our closure
$double = function($a) {
return $a * 2;
}; // This is our range of numbers
$numbers = range(1, 5); // Use the closure as a callback here to
// double the size of each element in our
// range
$new_numbers = array_map($double, $numbers); print implode(' ', $new_numbers);
?>
输出:
2 4 6 8 10
参考:http://www.php.net/manual/zh/language.types.callable.php
一篇文章:
call_user_func函数是当需要动态调用函数时,才使用的,这个函数有两种用法:
第一种是调用孤独的函数:
<!--?
function funa($b,$c)
{
echo $b;
echo $c;
}
call_user_func('funa', "111","222");
call_user_func('funa', "333","444");
//显示 111 222 333 444
//大家有没有发现,这个用法有点像javascript中的call方法,嘿嘿
?-->
第二种是调用类内部的函数
<!--?
class a {
function b()
{
$args = func_get_args();
$num = func_num_args();
print_r($args);
echo $num;
}
}
call_user_func(array("a", "b"),"111","222");
?-->
上面这个例子,自己运行一下看看结果是什么吧~嘿嘿~提示一下func_get_args()函数是获取传入到函数中的参数,返回一个数组,func_num_args()函数获取传入函数中的参数的个数。
下面再来看看
call_user_func_array函数
这个函数也是当需要动态调用函数时用到的,它的用法和call_user_func函数比较像,只是参数传入的是数组。
<!--?
function a($b, $c)
{
echo $b;
echo $c; }
call_user_func_array('a', array("111", "222"));
//显示 111 222
?-->
<!--?
Class ClassA
{ function bc($b, $c) {
$bc = $b + $c;
echo $bc;
}
}
call_user_func_array(array('ClassA','bc'), array("111", "222"));
//显示 333
?-->
一个调用例子:
<!--?
function otest1 ($a)
{
echo( '一个参数' );
} function otest2 ( $a, $b)
{
echo( '二个参数' );
} function otest3 ( $a ,$b,$c)
{
echo( '三个啦' );
} function otest (){
$args = func_get_args();
$num = func_num_args();
call_user_func_array( 'otest'.$num, $args );
}
otest("11");
otest("11","22");
otest("11","22","33");
一个很奇怪的问题,我下面有一个文件;
<?php
namespace Foo\Bar\subnamespace; class foo
{ public function printArray(array $arr)
{
var_dump($arr);
}
} $foo1=new foo();
call_user_func_array(array($foo1,'printArray'),array(1,2));
报错:
Catchable fatal error: Argument 1 passed to Foo\Bar\subnamespace\foo::printArray() must be of the type array, integer given inF:\xampp\htdocs\php\pattern\namespace\file1.php on line 9
我传递的的确是数组啊。
为什么printArray说不是数组,换成call_user_func:
call_user_func(array($foo1,'printArray'),array(1,2));
竟然正常了。这个无法解释。
php call_user_func和call_user_func_array的更多相关文章
- 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 和 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) { ...
- PHP回调函数call_user_func()和call_user_func_array()的使用
call_user_func():把第一个参数作为回调函数调用 用法:call_user_func ( callable $callback [, mixed $parameter [, mixed ...
- 简单理解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_ ...
- call_user_func 与call_user_func_array 的使用与区别
1 call_user_func 的使用 1)使用方法直接传递值 function nowamagic($a,$b){ echo $a; echo $b; } call_user_func('nowa ...
- PHP 回调函数call_user_func和 call_user_func_array()的理解
call_user_func(function,param); // 第一个参数是回调函数的函数名,第二个参数是参数 call_user_func函数类似于一种特别的调用函数的方法.其主要有以下的类型 ...
- PHP中的call_user_func()与call_user_func_array()简单理解
原文地址:http://small.aiweimeng.top/index.php/archives/52.html call_user_func:把一个参数作为回调函数调用 用法说明: call_u ...
随机推荐
- js 模拟java 中 的map
//js模拟map Map = { obj : {}, put : function(key , value){ this.obj[key] = value; }, get : function(ke ...
- Sql Server之数据库规范——1、自动化规范命名
一.废话: 随着数据库的规模越来越大,数据库的表也有成百上千,如果需要对数据库表名及字段名做操作,单个还好,直接一条语句搞定了,但如果要对整个库的所有表和字段名做操作,那就显得有点麻烦了.因此,我们需 ...
- 解决.Net MVC EntityFramework Json 序列化循环引用问题.
以前都是到处看博客,今天小菜也做点贡献,希望能帮到大家. 废话不多说,直接进入正题. 用过.net MVC的同学应该都被json序列化报循环引用错误这个问题骚扰过.网上有一些解决办法,但是都治标不治本 ...
- button变成href (即按钮超链效果)
法一: 这种方法适合做单纯的HTML静态页面,因为它只有button的显示效果,但不能真的跳转.貌似是鸡肋,没多大用. 法二: 1.新打开一个页面 2.本页打开 在超链中实现打开新页面用targe ...
- Asp.Net请求处理机制中IsApiRuntime解析
今天看了web请求的生命周期,看完了还有些不懂,就是用反编译工具,查看封装内库的内部实现. 从计算机内部查到web.dll,使用反编译工具打开 打开后 public int ProcessReques ...
- 服务器搭建纪录linux+mysql+nginx+php
新的项目启动 第一版 首先买了阿里云,选好环境镜像包,一键安装. 第一版php打算不用框架,完全手写,主要的功能点 数据交互和图片传输. 后台搭建好后,使用PHP的Laravel, web端还是选定b ...
- opengl 正方体+模拟视角旋转
// first_3D.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <GL/glut.h> #includ ...
- for循环产生的Cortex-M3汇编代码的一个奇怪现象
最近比较一下KEIL和IAR两个编译器产生的代码,基于Cortex-M3处理器的,然后发现了一几个奇怪的地方. 很简单的一个C的for循环 void fun_for_add_65535(void) { ...
- Umbraco隐藏属性
Umbraco默认的Url地址,是根据Node路径来默认显示的,因此使用中文的话比较尴尬. 网上有传的方法,是修改源码,来实现Url的重写. 但实际大可不必如此麻烦,只需要增加两个类型为Textstr ...
- SPOJ 220 Relevant Phrases of Annihilation(后缀数组+二分答案)
[题目链接] http://www.spoj.pl/problems/PHRASES/ [题目大意] 求在每个字符串中出现至少两次的最长的子串 [题解] 注意到这么几个关键点:最长,至少两次,每个字符 ...