PHP8.1.21版本已发布
vue8.1.21版本已发布
jquery8.1.21版本已发布

博客列表 > PHP函数作用域、闭包及函数多值返回

PHP函数作用域、闭包及函数多值返回

陈强
陈强 原创
2021年01月29日 17:20:10 995浏览

函数声明与调用

  • 函数声明使用关键字function 函数名称(类型限定 参数列表) : 返回值类型
  1. //function 后边函数名称(类型限定 参数列表) : 返回值类型
  2. function user(string $name) : string
  • 函数返回值用return ,没有return返回值为null
  1. //参数可以多个,用','隔开
  2. function user(string $name, int $age): string
  3. {
  4. return $name . $age;
  5. }
  6. echo user('jack', 30);//输出jack 30

函数的分类

  • 命名函数:命名函数在全局都可调用
  1. //user 为函数名
  2. function user(string $name, int $age): string
  3. //用函数名调用
  4. echo user('jack',30);
  • 匿名函数 :需要把函数赋值给一个变量使用
  1. //把函数赋值给变量$user
  2. $user = function (): string
  3. {
  4. return 'jerry';
  5. }
  6. //用变量调用
  7. echo $user();

函数的参数

  • 必选参数
  1. function user(string $name): string
  2. {
  3. return $name ;
  4. }
  5. //调用的时候参数必须输入
  6. echo user('jack');
  • 可选参数
  1. function user(string $name,int $age = 18): string
  2. {
  3. return $name .$age;
  4. }
  5. //$age设定了默认值,调用的时候可以不输入,如果输入则替换默认值
  6. echo user('jack');
  • 不定参数
  1. //在不去定参数的情况下可以用...rest语法,把参数压到数组中
  2. function user(string ...$arr): string
  3. {
  4. //数组求和
  5. return array_sum($arr);
  6. }
  7. echo user(1, 2, 3, 4, 5);
  • 引用参数:引用参数(&)会修改原始参数的值
  1. $age = 30;
  2. function man(int &$age): string
  3. {
  4. $age = 100;
  5. return $age;
  6. };
  7. echo man($age), '<br>';
  8. //因为$age被引用,函数内的$age值改变了全局的$age,输出$age = 100
  9. echo $age;

作用域与闭包

  • 作用域 在函数中调用外部的变量
  1. $name = 'jack';
  2. $age = 30;
  3. function user(): string
  4. {
  5. //函数内部声明的变量外部不可见
  6. $gender = '男';
  7. //用关键字global来调用外部的变量
  8. global $name;
  9. //也可以用$GLOBALS直接调用
  10. return $name . $GLOBALS['age'];
  11. }
  12. echo user();
  • 闭包 匿名函数
  1. $name = 'jack';
  2. $age = 30;
  3. //匿名函数需使用use 来引入参数
  4. $user = function () use ($name, $age): string {
  5. return $name . $age;
  6. };
  7. echo $user();
  • 匿名可以使用引入传参
  1. //用'&'引入传参
  2. $user = function ($myname) use (&$name): string {
  3. return $name = $myname;
  4. };
  5. //改变$myname的值为jerry
  6. echo $user('jerry');
  7. //$name的值也更新为jerry
  8. echo $name;
  • 闭包的最佳使用场景 : 返回一个函数
  1. function user($name)
  2. {
  3. return function ($color) use ($name): string {
  4. return sprintf('<h3 style="color:%s">%s</h3>', $color, $name);
  5. };
  6. }
  7. $closure = user('jerry');
  8. echo $closure('red');
  • use禁止使用以下三种参数

    • 超全局不让用,如 $_GET

    • $this

      1. 与当前参数重名不让用

回调函数

  • call_user_func_array(函数,[参数数组])
  1. function user(string $name): string
  2. {
  3. return printf('我叫 %s', $name);
  4. }
  5. //采用回调异步执行
  6. call_user_func_array('user', ['jack']);

函数多值返回

  • 数组
  1. function user(): array
  2. {
  3. return ['name' => 'jack', 'age' => '30'];
  4. }
  5. var_dump(user());
  • 对象
  1. function man(): object
  2. {
  3. //创建一个匿名类返回
  4. return new class()
  5. {
  6. public $name = 'jack';
  7. public $age = 30;
  8. };
  9. }
  10. //把函数赋给一个变量
  11. $user = man();
  12. //使用变量调用
  13. var_dump($user);
  14. //调用对象中的一个元素
  15. echo $user->name;
  • php内置的序列化函数
  1. function user(): string
  2. {
  3. return serialize(['name' => 'jack', 'age' => '30']);
  4. }
  5. //将函数的返回值赋给变量$user
  6. $user = user();
  7. //输出$user
  8. echo $user; //{"name":"jack","age":"30"}
  9. //用json_decode把返回值赋给变量$res
  10. $res = unserialize(user());
  11. //输出
  12. var_dump($res);
  13. //array(2) { ["name"]=> string(4) "jack" ["age"]=> string(2) "30" }
  • 通用的json格式的字符串
  1. function user(): string
  2. {
  3. return json_encode(['name' => 'jack', 'age' => '30'], JSON_UNESCAPED_UNICODE);
  4. }
  5. //将函数的返回值赋给变量$user
  6. $user = user();
  7. //输出$user
  8. echo $user; //{"name":"jack","age":"30"}
  9. //用json_decode把返回值赋给变量$res
  10. $res = json_decode(user());
  11. //调用对象中的元素
  12. echo $res->name, $res->age;
  13. //默认是对象方式返回,如果使用数组方式返回json_decode()传入第二个参数 : true
  14. $res = json_decode(user(),true);
  15. var_dump($res);
  16. //输出:array(2) { ["name"]=> string(4) "jack" ["age"]=> string(2) "30" }

静态变量

  1. // 静态变量
  2. function demo1()
  3. {
  4. // 函数中的静态变量不会随函数调用结束而消失
  5. // 他会自动进入到下一次的函数调用中
  6. // 可以实现在函数的多次调用过程中:共享数据 / 数据通信
  7. static $i = 1;
  8. echo $i,'<br>';
  9. $i++;
  10. }
  11. // echo $i;
  12. echo demo1();
  13. echo demo1();
  14. echo demo1();
  15. echo demo1();
  16. echo demo1();

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议