??函数就是实现特定功能的代码块,我们定义函数的直接目的就是将程序按功能进行分块,以此呢,方便程序的使用、管理、阅读和调试。 ??函数大致可分为系统函数与自定义函数,当系统中提供给我们的函数不能实现你想要实现的一个特定功能的时候,就需要你自己去定义一个函数了,这称之为自定义函数,当然PHP中还有一些特殊形式的函数,比如递归函数,回调函数等。
可变函数(变量函数)
如果一个变量名后面有圆括号,PHP引擎将寻找与该变量的值同名的函数,并且尝试解析并执行这个函数
function test() {
echo "this is a test";
}
$demo = "test";
echo $demo;
echo $demo();
$md5 = "md5";
echo $md5;
echo $md5('123456');
回调函数
回调函数就是调用函数的时候将另一个函数的名称当作参数传递进去,并且在函数体中进行调用
function study($name) {
echo "$name is studying PHP basic courses";
}
function sing($name) {
echo "$name is singing an English song";
}
function play($name) {
echo "$name is playing video game";
}
使用可变函数声明和应用回调函数
function doWhat($funcName, $name) {
$funcName($name);
}
doWhat('study', 'Lucy');
doWhat('sing', 'Lucy');
doWhat('play', 'Lucy');
如何调用回调函数?
- call_user_func() 第一个参数 callback 是被调用的回调函数,其余参数是回调函数的参数
- call_user_func_array() 把第一个参数作为回调函数(callback)调用,把参数数组作(param_arr)为回调函数的参数传入
call_user_func('study', 'Lucy');
call_user_func_array('study', array('Lucy'));
echo call_user_func('md5', '123456');
echo call_user_func_array('md5', array('123456'));
array_map
为数组的每个元素应用回调函数。返回数组,包含回调函数处理之后数组的所有元素
$arr = array(1, 2, 3 ,4, 5);
function toDouble($i): int
{
$i *= 2;
return $i;
}
$res = array_map('toDouble', $arr);
print_r($arr);
print_r($res);
array_walk
- 使用用户自定义函数对数组中的每个元素做回调处理
- 参数:array, callback(典型情况下 callback 接受两个参数。array 参数的值作为第一个,键名作为第二个)
- 如果 callback 需要直接作用于数组中的值,则给 callback 的第一个参数指定为引用。这样任何对这些单元的改变也将会改变原始数组本身。
- 只有 array 的值才可以被改变,用户不应在回调函数中改变该数组本身的结构。例如增加/删除单元,unset 单元等等。
- 返回: 成功时返回 true, 失败时返回 false
$arr = array(1, 2, 3, 4, 5);
function toThreeTimes(&$i): int
{
$i *= 3;
return $i;
}
$res = array_walk($arr, 'toThreeTimes');
var_dump($res);
print_r($arr);
array_filter
- 用回调函数过滤数组中的单元
- 依次将 array 数组中的每个值传递到 callback 函数。如果 callback 函数返回 true,则 array 数组的当前值会被包含在返回的结果数组中。数组的键名保留不变。
- 返回:返回过滤后的数组
$arr = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
function toEvent($i) {
if ($i % 2 == 0) return $i;
}
$res = array_filter($arr, 'toEvent');
print_r($res);
递归函数
- 递归函数即自调用函数,在函数体内部直接或者间接的自己调用自己,即函数的嵌套调用是函数本身
- 通常在此类型的函数提之中会附加一个条件判断叙述,以判断是否需要执行递归调用,并且在特定的条件下终止函数的递归调用动作,把目前流程的主控权交回到上一层函数来执行。
- 以此,当某个执行递归调用的函数没有附加条件判断叙述时,可能会造成无限循环的错误情形。
php实现递归的三种方法
利用引用做参数
- 引用不过是指两个不同名的变量指向同一块存储地址。
- 本来每个变量有各自的存储地址,赋值删除各行其道。
- 现在需要两个变量共享一块存储地址,因而任何对存储地址数值的改变都会影响两个值
function test1($i = 0, &$result = array()) {
$i ++;
if ($i < 10) {
$result[] = $i;
test1($i, $result);
}
echo $i;
return $result;
}
var_dump(test1());
利用全局变量
- 利用全局变量完成递归函数,global在函数内申明变量不过是外部变量的同名引用,变量的作用范围仍然在本函数范围内
- 改变这些变量的值,外部同名变量的值自然也改变了
function test2($i = 0, $result = array()) {
global $result;
$i ++;
if ($i < 10) {
$result[] = $i;
test2($i, $result);
}
return $result;
}
var_dump(test2());
利用静态变量 static
仅在第一次调用函数的时候对变量进行初始化,并且保留变量值
function test3() {
static $i = 0;
echo $i;
$i ++;
}
test3();
test3();
test3();
test3();
test3();
function test4($i = 0, $result = array()) {
static $result;
$i ++;
if ($i < 10) {
$result[] = $i;
test4($i, $result);
}
return $result;
}
var_dump(test4());
总结:所谓递归函数,重点是如何处理函数调用自身是如何保证所需要的结果得以在函数间合理"传递"
匿名函数
- 匿名函数,也叫闭包函数,允许临时创建一个没有指定名称的函数
- 经常用作回调函数 callable 参数的值
- 非匿名函数在定义时就创建函数对象和作用域对象,以后即使未调用,也占空间
- 匿名函数只有在调用时,才会创建函数对象和作用域对象。调用完后立即释放,节省内存
$func = function () {
};
function content1() {
$func = function ($param) {
echo $param;
};
$func('hello world');
}
content1();
function content2(): Closure
{
return $func = function ($param) {
echo $param;
};
}
$data = content2();
$data('hello world');
function callbackFunc($func) {
$func('hello world');
}
$func = function ($param) {
echo $param;
};
callbackFunc($func);
callbackFunc(function ($param) {
echo $param;
});
function func($param): Closure
{
return function () use ($param) {
echo $param;
};
}
$func('hello world');
php函数使用可变数量的参数
php在用户自定义函数中支持可变数量的参数列表
在php5.5及更早的版本中,使用 func_num_args(), func_get_arg(), func_get_args() 函数实现
function func() {
echo func_num_args();
print_r(func_get_arg(0));
print_r(func_get_args());
}
func('a');
func(1, 2, 3);
func(array('a', 'b'), 'c');
在php5.6及以上的版本中,可以使用 … 语法实现
function func(...$params) {
echo count($params);
print_r($params[0]);
print_r($params);
}
func('a');
func(1, 2, 3);
func(array('a', 'b'), 'c');
|