1.可变函数的使用
在PHP中如果将“函数名称”赋予字符串类型的变量,但是自使用该变量时,如果带有小括号,那么PHP引擎将解析函数
【1】系统函数
$funcName="md5";
echo $funcName('king');//b2086154f101464aab3328ba7e060deb
echo md5('king');//b2086154f101464aab3328ba7e060deb
//二者打印出的结果一致
【2】自定义函数
function test(){
echo 'this is a test';
}
test();//this is a test
$funcName="test";
$funcName();//this is a test
get_defined_functions():可以得到所有已定义的函数,返回值时数组格式,包含系统函数和用户自定义的函数
注意:可变函数不用用于像echo,print,unset(),isset(),empty(),include,require以及类似的语言结构,需要自己封装之后实现
2.回调函数的使用
回调函数就是调用函数的时候将另一个函数的名称当做参数传递进去,并且在函数体内进行调用
【1】简单例子,帮助理解
<?php
//回调函数的使用
function study(){
echo 'studying...<br/>';
}
function play(){
echo 'playing...<br/>';
}
function sing(){
echo 'singing...<br/>';
}
function dowhat($funcName){//$funcName接收的正好就是另外一个函数的名字
echo "我正在";
$funcName();//通过可变函数形式进行调用
}
dowhat('study');//我正在studying...
dowhat('play');//我正在playing...
dowhat('sing');//我正在singing...
?>
【2】给回调函数传参数(一个参数)
<?php
function study($username){
echo $username.' is studying...<br/>';
}
function play($username){
echo $username.' is playing...<br/>';
}
//$funcName 回调函数的名称
//$param 回调函数的参数
function dowhat($funcName,$param){
$funcName($param);//通过可变函数形式进行调用
}
dowhat('study','King');//King is studying...
?>
【3】给回调函数传参数(多个参数)
function add($x,$y){
return $x+$y;
}
function reduce($x,$y){
return $x-$y;
}
function calc($funcName,$i,$j){
return $funcName($i,$j);
}
echo calc('add',1,3); //4
echo calc('reduce',1,3); //-1
【4】系统函数中使用回调函数的形式
// array_map( callable $callback , array $array1 [, array $... ])
//作用:将回调函数作用到给定数组的每一个元素上
//array_map('')
$array=[1,2,3,4,5];
function test($i){
return $i*2;
}
$res=array_map('test',$array);
var_dump($array);
//array(5) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) }
var_dump($res);
//array(5) { [0]=> int(2) [1]=> int(4) [2]=> int(6) [3]=> int(8) [4]=> int(10) }
//array_walk( array $array , callable $callback [, mixed $userdata ])
//作用:使用用户自定义的函数$callback对数组$array的每个元素做回调处理
$array=[1,2,3];
function test($i){
$j=$i*2;
return $j;
}
$res=array_walk($array,'test');
var_dump($res);//bool(true)
var_dump($array);
//array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) }
//array_filter( array $array [, callable $callback [, int $flag = 0 ]]): array
//对数组中的每一元素进行回调函数过滤处理
$array=[1,2,3,4,5,6,7];
function odd($var){
if($var%2==1){
return $var;
}
}
$res=array_filter($array,'odd');
var_dump($res);
//array(4) { [0]=> int(1) [2]=> int(3) [4]=> int(5) [6]=> int(7) }
如何调用回调函数
- 可以通过可变函数的形式在函数体中进行调用
- 可以通过call_user_func()和call_user_func_array()进行调用
//###call_user_func( callable $callback [, mixed $parameter [, mixed $... ]]): mixed
// $callback 第一个参数作为回调函数调用
// $parameter 第二个参数作为回调函数的参数传入
//###call_user_func_array( callable $callback , array $param_arr ): mixed
// $parameter 第二个参数作为回调函数的参数传入
// $parameter 第二个数组参数作为回调函数的参数传入
function study($username){
echo $username.' is studying...<br/>';
}
function play($username){
echo $username.' is playing...<br/>';
}
function test(){
echo 'this is test<br/>';
}
function add($x,$y){
return $x+$y;
}
function reduce($x,$y){
return $x-$y;
}
call_user_func('study','queen');//queen is studying...
call_user_func('play','mooc');//mooc is playing...
call_user_func('test');//this is test
echo call_user_func('md5','King');//719ef271d38a388fd7b2bc967f4bd885
echo call_user_func('add',1,3);//4
echo call_user_func_array('add',[1,3]);//4
echo call_user_func_array('add',[1,3]);//-2
3.匿名函数的使用
- 匿名函数,也叫闭包函数,允许临时创建一个没有指定名称的函数,最经常用作回调函数参数值
- 匿名函数也可以作为变量的值来使用
【1】创建匿名函数,并使用
<?php
//[1]声明一个匿名函数,并把它赋给一个变量
$func=function(){
return 'this is a test';
};//此处是赋值语句,必须加分号
echo $func();//通过可变函数的形式来调用
//output this is a test
//[2]声明一个带参数匿名函数,并把它赋给一个变量
$func1=function($username){
return 'say hello to '.$username;
};//此处是赋值语句,必须加分号
echo $func1('King');//通过可变函数的形式来调用
//output say hello to King
?>
【2】通过create_function来创建匿名函数
//不传参
$func=create_function('','echo "this is a test ....";');
$func();//output this is a test ....
//传参
$func1=create_function('$x,$y','return $x+$y;');
echo $func1(3,4); //7
【2】在系统函数中创建匿名函数并使用
//array_map使用匿名函数传参
$array=[1,2,3,4,5];
$res=array_map(function($var){return $var*2; },$array);
var_dump($res);
//array(5) { [0]=> int(2) [1]=> int(4) [2]=> int(6) [3]=> int(8) [4]=> int(10) }
//call_user_func使用匿名函数传参
call_user_func(function($username){ echo "hello {$username}";},'king');
//hello king
4.递归函数的使用
如果函数A需要调用函数B,而发现函数B的代码实现与函数A完全相同,依次类推,此时就需要封装为递归函数
使用递归函数的地方:
- 像PHP实现目录的遍历,目录的复制,删除非空目录操作必须通过递归函数实现
- 像无限极分类也可以通过递归实现
总之,递归函数就是自己调用自己的函数,通过特定条件结束执行
function test($i){
echo $i.'<br/>';
--$i;
if($i>=0){
test($i);
}
}
test(3);//3 2 1 0
function test1($i){
echo $i.'<br/>';
--$i;
if($i>=0){
//test1($i);
$func=__FUNCTION__;//获取当前函数名称
$func($i);
}
echo $i.'<br/>';
}
test1(3);
//3 2 1 0 -1 0 1 2