用户自定义函数
<?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层
函数参数
-
引用传参
function foo(&$arg) { $arg = 1; }
在参数前面加上
&
可以将值传递变为引用传递,在函数内对变量做的操作会改变函数外的变量 -
参数默认值
<?php function foo($arg='demo') { var_dump($arg); }
默认值必须是常量表达式,不能是变量、类成员、函数调用等
-
可变数量参数
<?php function 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
有了命名参数后在调用函数时就可以忽略参数顺序,配合参数默认值使用的话就可以在使用函数时只传需要的参数而不必要将无意义的值也传上
命名参数通过在参数名前加上冒号来传递,可以使用保留关键字,但不能使用变量<?php function foo(first_num: $a, last_num: $b) { return $a + $b; }
返回值
使用return可以返回任何类型数据,return会立即终止函数的执行,并将执行权交还给调用者
可以使用list
解包数组类型的返回值
<?php
function foo()
{
return ['one', 'two'];
}
list($a, $b) = foo();
函数返回引用类型值时,函数声明和函数调用前都必须加&
<?php
function &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
<?php
class 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'));
网友评论