函数
函数使用关键字function进行定义
function func($a, $b)
{
return $a + $b;
}
函数由参数、返回值、函数工作代码构成,非常简单
参数
形参、实参:和大多数语言一样,定义的参数被称为形参,调用函数实际传入的被称为实参
function demo($name, $age){ // 这里的是形参
echo $name . ":" . $age
}
demo('张三', 16) // 这里的是实参
参数类型声明,可以在参数位置定义期望的传参数类型,如果不匹配则会出现Fatal error(php5)、TypeError exception(php7)
class C{};
function demo(C $c){
echo var_dump($c);
}
demo(new C)
默认情况下,当传递的参数不是函数指定的参数类型时,php将会尝试将其转换为指定的类型,比如字符串与数字之间的转换,php版本的不同可以支持的参数类型指定不同
匿名函数
匿名函数在声明时会省略函数名,其余和普通函数相同,类似Python,可以在很多内置函数使用时,直接在参数位置定义匿名函数更快捷的进行方法调用
function (args){
code;
return ;
}
比如使用array_map对数组元素进行批量加工
$a = [1, 2, 3, 4];
$result = array_map(function ($var) {
return $var * $var;
}, $a);
var_dump($result);
array(4) { [0]=> int(1) [1]=> int(4) [2]=> int(9) [3]=> int(16) }
闭包函数
在PHP中闭包与匿名函数是一个概念
使用 use 关键字,闭包函数可以实现从父级作用域中继承变量
$name = 'world';
$sayHello = function () use ($name) {
echo("Hello $name");
};
$sayHello();
单纯使用use可以让闭包函数使用上层作用域下的变量,但无法引用修改,如希望修改,需要在变量use时候使用&符
$name = 'old';
$sayHello = function () use (&$name) {
$name = 'new';
};
$sayHello();
echo $name; // 输出 new
变量函数
可以将可调用方法作为字符串变量,当字符串变量后携带有括号时,php将会寻找同名函数并执行
比如
function test(){
echo "nice";
}
$func = 'test';
$func() // 当字符串变量加了()
但是不能直接使用用于例如echo、print、unset()、isset()、empty()、include、require以及类似的语言结构
回调函数
php中通过字符串函数名,可以很方便的实现回调函数
function func(){
echo "func";
}
function test($funcname){
$funcname();
}
test("func")
PHP还提供了两个内置函数call_user_func()、call_user_func_array()来对回调函数进行支持
call_user_func($callback [, $parameter, ... ])
第一个参数$callback是被调用的回调函数,其余参数是回调函数的参数,多个参数之间使用,分隔
function func($funcname, $a, $b){
return call_user_func($funcname, $a, $b);
}
function add($a, $b){
echo $a + $b;
}
func('add', 1, 1)
call_user_func_array($callback ,$param_arr)
function func($funcname, $a, $b){
return call_user_func_array($funcname, array($a, $b));
}
function add($a, $b){
echo $a + $b;
}
func('add', 1, 1)
递归函数
函数内部调用函数本身,则为递归
在 PHP 中最大递归层数也不是没有限制的,这与程序的内存限额有关
PHP5 默认允许一个程序使用 128M 的内存,PHP7 默认允许使用 256M 的内存
当递归层数过大导致 128M 内存耗尽时,程序就会产生一个致命错误并退出
实现递归的灵魂是确定递归的终止条件,比如求1-10的和,递归方式,那么终止条件为达到10
$i = 0;
function get_sum($i)
{
if ($i == 11) return 0; // 到达递归终点,不加了 终止递归
return $i + get_sum($i + 1);
}
print get_sum($i); // 55
递归实现斐波那契数列
function demo($num){
if($num == 1 || $num == 2){
return 1;
}else{
return demo($num - 1) + demo($num - 2);
}
}
echo '数列第 10 位是:'.demo(10);