本文是温习所写,并不会涵盖一些根底知识点
用户自定义函数
<?php/** * 示例函数 * * @param mixed $arg1 参数一 * @param mixed $arg2 参数二 * @param mixed $argN 参数N * @return mixed */function foo($arg1, $arg2, $argN){ return 'called!';}
- PHP中函数是全局的,只有定义了就能够在任何中央调用
- 函数外部能够写任何无效的PHP代码,就算定义函数和类也是能够的
- PHP不反对函数重载,也不能取消定义和重写义已申明函数
- 递归调用时,要防止超过100~200层
函数参数
援用传参
<?phpfunction foo(&$arg){ $arg = 1;}
在参数后面加上
&
能够将值传递变为援用传递,在函数内对变量做的操作会扭转函数外的变量参数默认值
<?phpfunction foo($arg='demo'){ var_dump($arg);}
默认值必须是常量表达式,不能是变量、类成员、函数调用等
可变数量参数
<?phpfunction foo($arg, ...$args){ var_dump($arg); var_dump($args);}foo(1,2,3,4,5);foo([1,2,3]);
在参数前加
...
来标识这个参数是可变参数可变参数只能是参数列表中最初一个
也能够通过
func_num_args()
、func_get_arg()
、func_get_args()
函数来获取可变参数命名参数 PHP 8
有了命名参数后在调用函数时就能够疏忽参数程序,配合参数默认值应用的话就能够在应用函数时只传须要的参数而不必要将无意义的值也传上
命名参数通过在参数名前加上冒号来传递,能够应用保留关键字,但不能应用变量
<?phpfunction foo(first_num: $a, last_num: $b){ return $a + $b;}
返回值
应用return能够返回任何类型数据,return会立刻终止函数的执行,并将执行权交还给调用者
能够应用list
解包数组类型的返回值
<?phpfunction foo(){ return ['one', 'two'];}list($a, $b) = foo();
函数返回援用类型值时,函数申明和函数调用前都必须加&
<?phpfunction &foo(){ $a = 1; return $a;}$b = &foo();
可变函数
如果变量名后有()
,PHP将寻找与变量的值同名的函数,并尝试执行
<?php$funName = 'foo';// 函数function foo($a){ var_dump($a);}$funName('demo');// 类办法class Test(){ static $foo = 'attribute'; public function foo($a) { var_dump($a); } public static function two($a) { var_dump($a); } }(new Test())->$funName('test'); // 形式一$fun = ['Test', 'foo']; // 形式二$fun();$fun = [new Test, 'foo']; // 形式三$fun();$fun = 'Test::two'; // 类静态方法$fun();
外部函数
PHP有很多内置函数,有些函数是须要和特定的扩大一起编译
function_exists()
判断函数是否存在
get_extension_funcs()
获取某个模块的函数列表
dl()
加载模块
匿名函数
匿名函数是通过Closure
类来实现
匿名函数能够用use
来从父类继承变量,也能够定义参数
<?php$a = 1;$fun = functon ($b) use ($a) { echo $a + $b;};
在类中应用时,会在匿名函数外部主动绑定$this
<?phpclass Test(){ public $attr = 1; public function foo() { return function (){ var_dump($this); } } // 当不须要主动绑定时,能够将匿名函数动态化 public function two() { return static function() { var_dump($this); } }}
箭头函数 PHP 7.4
箭头函数跟匿名函数一样,都是通过Closure
实现,只是比匿名函数更简洁,也只能实现比较简单的性能
箭头函数会主动捕捉父作用域变量进行值拷贝
<?php$x = 1;$fn = fn($a, $b) => $a + $b + $x;var_dump($fn(1, 2));// 箭头函数能够嵌套$fn = fu($a) => fu($b) => $a + $b;var_dump($fn(1)(2));
First class callable syntax PHP 8.1
这是一中援用闭包的新办法
<?php// PHP8.1之前// 应用Closure将函数转成闭包模式$closure = Closure::fromCallable('strlen');var_dump($closure('sssss'));// PHP8.1$closure = strlen(...);var_dump($closure('demo'));