欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

全面演示: 函数的作用域与闭包,回调的使用场景以及函数的多值返回方式

程序员文章站 2022-01-15 10:58:19
...

函数的作用域与闭包:

样式代码:

  1. // 声明在函数外部的成员,默认就是全局成员
  2. $laos = '后端老师';
  3. $youx = '0121223154@qq.com';
  4. function index1(): string
  5. {
  6. // 函数作用域: 只有调用它的时候才会创建
  7. $dsw= '';
  8. // 1. global 访问全局/外部的成员
  9. global $laos;
  10. $dsw .= 'laos = ' . $laos . '<br>';
  11. // 2. $GLOBALS 超全局数组
  12. $dsw .= 'youx = ' . $GLOBALS['youx'] . '<br>';
  13. return $dsw;
  14. }
  15. echo index1(),'<hr>';
  16. // 2. 闭包: 匿名函数 闭包: 可以访问函数外部的*变量/父作用域中的变量
  17. $bbao2 = function () use ($laos, $youx) {
  18. return sprintf('laos = %s<br>youx = %s<br>', $laos, $youx);
  19. };
  20. echo $bbao2(),'<hr>';
  21. // 闭包支持引用传参: 参数前加&
  22. echo '当前: laos = ' . $laos . '<br>';
  23. $gb3 = function ($mylaos) use (&$laos) {
  24. // 闭包中将引用参数更新后,会实时的映射到外部的原始条件中
  25. $laos = $mylaos;
  26. };
  27. $gb3('前端老师');
  28. echo '现在: laos = ' . $laos . '<br>';
  29. // 闭包经常用作函数的返回值
  30. function bbhs4($site)
  31. {
  32. // 返回一组函数,闭包最佳使用场景
  33. return function ($color) use ($site) {
  34. return sprintf('<h3 style="color:%s">%s</h3>', $color,$site);
  35. };
  36. }
  37. // 高阶函数: 柯里化
  38. echo bbhs4('提交作业完成')('violet');

效果预览:

全面演示: 函数的作用域与闭包,回调的使用场景以及函数的多值返回方式

回调的使用场景:

  1. php单选程,同步执行,如果遇到耗时函数会发生阻塞,应该将它改为异步回调执行

样式代码:

  1. // 回调方法
  2. function index1(string $name) : string
  3. {
  4. return "Hello waayou $name !";
  5. }
  6. // 传统
  7. echo index1('早上好'), '<hr>';
  8. // call_user_func(函数, 参数列表)
  9. echo call_user_func('index1','中午好'), '<hr>';
  10. // call_user_func_array(函数, [参数数组])
  11. echo call_user_func_array('index1',['晚上好']), '<hr>';
  12. // 这二个函数还可以异步的调用对象方法
  13. class User
  14. {
  15. // 实例方法
  16. public function hello(string $name) : string
  17. {
  18. return "Hello waayou $name !";
  19. }
  20. // 静态方法: 类调用
  21. public static function say(string $site) : string
  22. {
  23. return "上班要打卡 $site !";
  24. }
  25. }
  26. // 实例方法
  27. $xqh = call_user_func_array([new User, 'hello'], ['编程老师']);
  28. echo $xqh,'<hr>';
  29. // 静态方法
  30. $xqh = call_user_func_array('User::say', ['不能早退']);
  31. echo $xqh, '<br>';

效果预览:

全面演示: 函数的作用域与闭包,回调的使用场景以及函数的多值返回方式

演示函数的多值返回类型方式,重点是json:

样式代码:

  1. <?php
  2. // 1. 数组
  3. function index1(): array
  4. {
  5. return ['zsygzy' => 11, 'tijiaozy' => '提交成功'];
  6. }
  7. $szy = index1();
  8. echo $szy['zsygzy'] === 1 ? $szy['tijiaozy'] : '提交失败.....';
  9. echo '<hr>';
  10. // 2. 对象
  11. function index2() : object
  12. {
  13. return new class ()
  14. {
  15. public $email = '邮箱';
  16. public $passow = '密码';
  17. };
  18. }
  19. $user = index2();
  20. printf('email = %s<br>passow = %s<br>', $user->email, $user->passow);
  21. echo '<hr>';
  22. // 3. 序列化的字符串
  23. function index3(): string
  24. {
  25. return serialize(['email' => 1, 'passow' => '验证通过']);
  26. }
  27. $xlh = index3();
  28. echo $xlh,'<hr>';
  29. // 在php中使用时要还原成原来的类型
  30. $arr = unserialize($xlh);
  31. echo var_dump($arr),'<hr>';
  32. // 4. 转为通用的json格式的字符串
  33. function index4(): string
  34. {
  35. return json_encode(['email' => 2, 'passow' => '验证通过'], JSON_UNESCAPED_UNICODE);
  36. }
  37. $xlh = index4();
  38. $str = json_decode($xlh);
  39. echo var_dump($str),'<hr>';
  40. // 默认将外部的json解析成object对象类型
  41. printf('email = %s<br>passow = %s<hr>',$user->email, $user->passow);

效果预览:

全面演示: 函数的作用域与闭包,回调的使用场景以及函数的多值返回方式