PHP 中call_user_func相关函数的使用

call_user_func

官方的解释是:把第一个参数作为回调函数(callback),并且将其余的参数作为回调函数的参数。

第一个参数可以是函数名,后面的均为作为该函数使用的参数。

1. call_user_func的初步使用

看例子:

// 1. 初步使用
function sayHi($name){
    echo $name .‘ say hi‘ ."<br>";
}

call_user_func(‘sayHi‘,‘Bob‘);
call_user_func(‘sayHi‘,‘Jack‘);

输出:

Bob say hi

Jack say hi

2. call_user_func用于递归函数中

著名的斐波那契函数,如果哪天我们改变了函数名即Factorial,那么该函数会报错,因为内部也使用到了Factorial。

function Factorial($i=1) {
  return ($i==1 ? 1 : $i*Factorial($i-1));
}

改进一下:

function FactorialImprove($i=1){
    return ($i == 1 ? 1 : $i * call_user_func(__FUNCTION__,$i-1));
}

这样的话如果外部函数名怎么变都不会出错。这里用到了PHP中的 __FUNCTION__ 魔法常量。

3. 类似的call_user_func_array

该函数接收两个参数,第一个参数不变,函数名,第二个是参数数组。

$func = function($arg1, $arg2) {
    return $arg1 * $arg2;
};

var_dump(call_user_func_array($func, array(2, 4)));

其实 call_user_func 函数在事件处理中有起到非常重要的作用。

看下一篇,PHP的事件处理。

时间: 2024-10-05 23:27:02

PHP 中call_user_func相关函数的使用的相关文章

php中call_user_func 与 call_user_func_array的使用

call_user_func()是利用回调函数处理字符串,call_user_func_array是利用回调函数处理数组. // 1. 调用自定义函数 function test($a, $b) { echo $a + $b; } // 字符串传参 call_user_func('test', 1, 2); // 3 // 数组式传参 call_user_func_array('test', [1, 2]); // 3 // 2. 调用匿名函数 call_user_func(function($

MFC中GetPrivateProfileString相关函数

项目中用到了这个函数,所以了解了一下,参考了一些博客: http://blog.sina.com.cn/s/blog_a599b5960101tsbk.html http://blog.csdn.net/artmcu/article/details/8077815(连着三篇) http://www.cnblogs.com/rosesmall/archive/2012/09/12/2681897.html 自己又动手实现了一下,又发现#include<afx.h>只能在MFC工程中用到,修改属性

OpenCV中Denoising相关函数的简单介绍

参考:http://wenhuix.github.io/research/denoise.html一.基本情况  (一)基本方法 Fast  Non-Local  MeansDenoising (FNLMD),论文为 Mahmoudi, Mona, and Guillermo Sapiro. "Fast image and video denoising via nonlocal means of similar neighborhoods." IEEE signal processi

IDL中路径相关函数总结

[转] 系统变量 系统变量 描述 !DIR IDL安装主目录 !PATH IDL搜索库文件及路径,包含IDL自带库文件路径和用户工作空间路径. !DLM_PATH IDL搜索DLM路径 !HELP_PATH IDL帮助文件路径 获取临时路径 IDL> print, GETENV('IDL_TMPDIR') C:\Users\Administrator\AppData\Local\Temp\ 修改工作空间当前路径:CD,通过current关键字获取当前路径 IDL> cd, 'D:\temp'

Oracle中的字符串类型及相关函数详解

1.概述 本文介绍String类型及相关的函数,基于当前最新的Oracle 12c 为基础作介绍. 下文将字符串简称为串. Oracle函数的工作方式有两种: 1.根据旧的对象创建新的对象--他们对原来的信息进行修改,如改变字母的大小写. 2.告诉用户有关的信息,如一个单词或句子中有几个字符. 后续会更新另外两种处理文本的方式:Oracle中的正则表达式 和 Oracle Text工具,等文章编辑完成,会在此处添加链接. Oracle中主要有两种字符串类型:CHAR和VARCHAR2,他们以字母

Cocos2d-x中__Dictionary容器以及实例介绍

__Dictionary类在Cocos2d-x 2.x时代它就是CCDictionary类,它是模仿Objective-C中的NSDictionary类而设计的,通过引用计数管理内存.__Dictionary继承于Ref类,因此它所能容纳的是Ref及子类所创建的对象指针. 1.创建__Dictionary对象 创建__Dictionary对象有很多函数,下面是总结常用的函数: static __Dictionary* create().创建__ Dictionary. static __Dict

Python 中的 pdb 模块

PYTHON 代码,尤其是别人写的代码看不懂.怎么办? 其实PYTHON中也提供了类似于C语言中用于debug 的 gdb.它叫做pdb.结合本人自己的学习,进行简单的举例,以做备忘和补偿学习. 首先参考资料: 1.http://web.stanford.edu/class/physics91si/2013/handouts/Pdb_Commands.pdf 2.https://docs.python.org/2/library/pdb.html 以 shadowsocks 的 local.py

Cocos2d-x中__Array容器以及实例介绍

__Array类在Cocos2d-x 2.x时代它就是CCArray类.它是模仿Objective-C中的NSArray类而设计的,通过引用计数管理内存.__Array继承于Ref类,因此它所能容纳的是Ref及子类所创建的对象指针. 1.创建__Array对象创建__Array对象有很多函数,下面是总结常用的函数:?static __Array* create().创建__Array.?static __Array* create(Ref* object, -).使用一系列Ref创建__Arra

Delphi中DLL的创建和使用【转】

Delphi中DLL的创建和使用     1.DLL简介:   2.调用DLL:   3.创建DLL:   4.两个技巧:   5.初始化:   6.例外处理.            1.DLL简介     DLL是Dynamic-Link   Libraries(动态链接库)的缩写,库里面是一些可执行的模块以及资源(如位图.图标等).可以认为DLL和EXE基本上是一回事,只是DLL不能直接执行,而必须由应用程序或者其他DLL调用.DLL为应用程序间的资源共享提供了方便,同时也是多语言混合编程的