函数语法
function 函数名称(类型限定 参数列表):返回类型{
//函数体
return 返回值
}
函数分类
- 命名函数 :自动提升到脚本的顶部,在全局的任何地方都可以调用
function demo()
{
return 'php';
}
echo demo() . '<br>';
- 匿名函数
$php = function () {
return 'php';
};
echo $php() . '<br>';
函数的参数
- 必选参数
function hello(string $name): string
{
return 'hello' . $name;
}
echo hello('admin'), '<br>';
echo hello(123), '<br>';
echo hello(true), '<br>';
- 可选参数
可选参数放在参数列表末尾,并且指定其默认值
当使用默认参数时,默认参数必须放在非默认参数的右侧,否则函数可能出错function hello1(string $name = 'admin'): string
{
return 'hello' . $name;
}
echo hello1('user'), '<br>';
echo hello1(), '<br>';
- 不定参数
参数数量 func_num_args()
参数数组 func_get_args()
获取某一个参数 func_get_arg(n)function args()
{
$n = func_num_args();
$args = implode(',', func_get_args());
$arg = func_get_arg(1);
printf('参数数量=%d 参数=%s,第二个参数:%s', $n, $args, $arg);
//求和
echo '参数之和' . array_sum(func_get_args());
}
args(1, 2, 4, 5);
…rest语法 剩余参数function args2(...$args)
{
print_r(($args));
$n = count($args);
$argss = implode(',', $args);
$arg = $args[1];
printf('参数数量=%d 参数=%s,第二个参数:%s', $n, $argss, $arg);
echo '参数之和' . array_sum($args);
}
args2(1, 2, 3, 4);
- 引用参数
php支持值传递和引用传递,默认就是值传递;引用传参:在函数内部对参数的任何更新都会实现映射到外部的参数中$name = 'admin';
function demo5(&$name)
{
$name = 'user';
}
echo "\$name=" . $name;
demo5($name);
echo "\$name=" . $name;
函数的返回值
函数只允许有一个返回值:单值返回;如果需要返回多个值,返回类型可以是数组 对象 序列化的 字符串 - 数组
function ok(): array
{
return ['code' => 1, 'msg' => 'ok'];
}
var_dump(ok());
- 对象
function user()
{
return new class()
{
public $name = 'admin';
public $email = 'admin@admin.com';
};
}
$user = user();
var_dump($user);
printf('name=%s<br> email=%s <br>', $user->name, $user->email);
- 序列化
php内置的序列化函数 如果这个序列化的数据只在php中使用,应该使用php内置的序列化方法function xu(): string
{
return serialize(['code' => 1, 'msg' => 'ok']);
}
echo xu();
在php中使用时还原成原来的类型$arr = unserialize(xu()); var_dump($arr);
- 通用的json格式
function demo6(): string
{
return json_encode(['code' => 1, 'msg' => 'ok']);
}
var_dump(demo6());
如果当前脚本接收一个json格式的数据,可以转成php能够处理的数据类型- 对象
$data = json_decode(demo6());var_dump($data); printf('status=%s,message=%s', $data->code, $data->msg);
- 数组
$arrTmp = json_decode(demo6(), true); var_dump($arrTmp);
函数作用域.只有调用它的时候才会创建
有2种方式可以在函数内部访问外部成员 $GLOBALS global $name
```html
$name = ‘admin’;
$email = ‘admin@qq.com’;
function demoo(): string
{
$res = ‘’;
global $name;
$res .= ‘name=’ . $name . ‘<br>‘;
$res .= ‘email=’ . $GLOBALS[‘email’] . ‘<br>‘;
//私有成员
$age=18;
$res .= ‘age=’ . $age . ‘<br>‘;
return $res;
}
echo demoo();
![](https://img.php.cn/upload/image/279/798/549/1615543670657486.png)
###闭包函数:匿名函数,可以访问函数外部的自由变量/父作用域中的变量
```html
$user11=function() use($name,$email){
printf('name=%s,email=%s', $name, $email);
};
echo $user11() . '<br>';
//闭包支持引用传参
printf('现在的:name=%s,email=%s', $name, $email);
$user12=function($newname,$newemail) use(&$name,&$email){
$name=$newname;
$email=$newemail;
};
echo $user12('user','user@admin.com') . '<br>';
printf('改变后的:name=%s,email=%s', $name, $email);
ps: use禁止使用以下三种参数
- 超全局不让用:$_GET;
- $this
- 与当前参数重名不让用
闭包经常用作函数的返回值
function demo7($site){
return function($color) use ($site){
return sprintf('<h2 style="color:%s">%s</h2>',$color,$site);
};
}
// $closure=demo7('站点');
// echo $closure('red');
//柯里化
echo demo7('站点')('red');
异步回调执行
php是单线程,同步执行时如果遇到耗时函数会发生阻塞,应该将它改为异步回调执行
call_user_func(函数,函数列表);
call_user_func_array(函数,[参数数组])
function demo8(string $name):string
{
return $name;
}
echo call_user_func('demo8','admin'),'<br>';
echo call_user_func_array('demo8',['admin']);
静态变量
函数中的静态变量不会随函数调用结束而消失,它会自动进入到下一次的函数调用中,可以实现在函数的多次调用过程中:共享数据/数据通信
function demo9(){
static $i=1;
echo $i,'<br>';
$i++;
}
echo demo9();
echo demo9();
echo demo9();
echo demo9();