PHP基础参考09-函数基础语法
目录
用户自定义函数
-
通常情况下,函数无需在调用前定义,除了有条件定义函数。
-
有条件定义的函数
除非有条件定义的函数。
//one();//这里就还不能调用函数one,因为one函数还不存在。 two();//这里是可以调用two函数的,定义一般在编译后就存在。 if(xx){ function one(){ //... } } one(); function two(){ }
还有一种有条件定义函数,就是函数中的函数,函数中的函数,也是一个令phper意外的语法:
function outer(){ function inner(){ } } //inner();这里还不能调用inner函数,因为还不存在 outer();//调用outer函数后,才真正定义了inner函数 inner();
-
作用域。php的函数和类都具有全局作用域。
不论定义在哪里,只要加载可访问即可调用。
-
PHP 不支持函数重载,也不可能取消定义或者重定义已声明的函数。
-
递归函数
在php中,我们除了要注意无限递归,还要避免递归调用超过100-200层,因为可能会使堆栈崩溃从而使当前脚本终止。
函数参数
-
函数参数默认传值方式
-
允许参数默认值
-
可变数量的参数列表
PHP 在用户自定义函数中支持可变数量的参数列表。由 … 语法实现函数接收参数列表。
注意:旧php版本经常使用这些函数来获取可变参数 func_num_args()、 func_get_arg() 和 func_get_args(),但我们不再建议使用此方式,以后建议使用 … 来替代。
function sum(...$numbers) { $acc = 0; foreach ($numbers as $n) { $acc += $n; } return $acc; } echo sum(1, 2, 3, 4);
灵活起来,扩展起来,胆大心细用起来。
-
… 语法还可以用来传递参数
主要用于传递数组,映射到函数参数列表
function add($a, $b) { return $a + $b; } echo add(...[1, 2])."\n"; $a = [1, 2]; echo add(...$a);
-
php8有个逗号的小细节,最后一个参数尾部可以追加逗号,这个逗号会被忽略,只为了方便垂直的书写很多的参数。
function a($aaa, $bbb, $ccc, $ddd, $eee, $fff, ){ //do something }
返回值
-
省略return。PHP中如果省略了 return,则返回值为 null。
-
返回多个值。php不支持返回多个值,可以考虑返回数组等符合类型。
-
返回一个引用。
没有深刻本质的理解引用的话,慎用函数返回引用。
function &returns_reference() { return $someref; } $newref =& returns_reference();
可变函
PHP 支持可变函数的概念。
也就是说一个变量名后有圆括号(),PHP 将寻找与变量的值同名的函数,并且尝试执行它。可变函数可以用来实现包括回调函数,函数表在内的一些用途。
经常用于回调函数。
function a($info,$callback){
function_exists($callback) && $callback($info);
}
function b($data){
var_dump($data);
}
a([1,2],"b");
可变函数,支持函数也支持类中的方法调用。
内置函数
php内置很多很好用的函数,也有一些需要扩展才能用的函数,比如image、mysqli等。
我们只想吐槽的是:php的内置函数总让我们很难记得住,我们觉得一些原因是参数原则、返回原则不统一导致的,我们有时不清楚这个函数是否有返回值,还是直接作用于参数变量上。
匿名函数
匿名函数也叫闭包函数,有javascript爱好的小伙伴,肯定很熟悉,也很经常使用。
匿名函数目前是通过 Closure 类来实现的
闭包还可以作为变量的值来使用,和可变函数相似。
常用于回调。
箭头函数
箭头函数是 PHP 7.4 的新语法,是一种更简洁的 匿名函数 写法。
箭头函数的基本语法为
fn (argument_list) => expr
箭头函数支持与 匿名函数 相同的功能,只是其父作用域的变量总是自动的
$y = 1;
$fn1 = fn($x) => $x + $y;
// 相当于 using $y by value:
$fn2 = function ($x) use ($y) {
return $x + $y;
};