php函数作用域与闭包|回调与参数-函数多值返回类型

  1. 实例演示函数作用域与闭包,回调的使用场景与参数调用;
  2. 实例演示函数的多值返回类型方式,重点是json

一、 php函数作用域与闭包

1.1函数作用域
作用域在函数中调用外部的变量

  1. <?php
  2. $name = '风萧萧兮易水寒';
  3. $email = 'fxx@php.org';
  4. $age = '18岁';
  5. $school='燕京大学';
  6. function demo1(): string
  7. {
  8. // 函数作用域: 只有调用它的时候才会创建
  9. $res = '';
  10. // 如果想在函数内部访问全局/外部的成员
  11. // $res .= 'name = ' . $name . '<br>';
  12. // 有二种方式可以在函数内部访问外部成员
  13. // 1. global
  14. global $name;
  15. $res .= 'name = ' . $name . '<br>';
  16. // 2. $GLOBALS,超全局数组不受作用域限制
  17. $res .= 'email = ' . $GLOBALS['email'] . '<br>';
  18. $res .= 'age = ' . $GLOBALS['age'] . '<br>';
  19. $res .='$school='. $GLOBALS['school'] . '<br>';
  20. // 私有变量: 外部不可见
  21. $grade = 98;
  22. $res .= 'grade = ' . $grade . '<br>';
  23. return $res;
  24. }
  25. echo demo1();
  26. echo '<hr>';

图示:
函数作用域

1.2闭包

  1. <?php
  2. $name = '风萧萧兮易水寒';
  3. $email = 'fxx@php.org';
  4. $age = '18岁';
  5. $school='燕京大学';
  6. // 闭包: 匿名函数
  7. // 闭包: 可以访问函数外部的自由变量/父作用域中的变量
  8. $use1= function () use ($name, $email,$age, $school) {
  9. return sprintf('name = %s<br>email = %s<br>age = %s<br>school = %s<br>', $name, $email, $age, $school);
  10. };
  11. echo $use1(), '<hr>';

图示:
闭包: 匿名函数
1.4 闭包支持引用传参: 参数前加 &

  1. <?php
  2. $name = '风萧萧兮易水寒';
  3. $email = 'fxx@php.org';
  4. $age = '18岁';
  5. $school='燕京大学';
  6. echo '当前: name = ' . $name . '<br>';
  7. $demo = function ($myname) use (&$name) {
  8. // 闭包中将引用参数更新后,会实时的映射
  9. $name = $myname;
  10. };
  11. $demo('碧血书香梦');
  12. echo '现在: name = ' . $name . '<br>';

图示:
闭包支持引用传参

use禁止使用以下三种参数

  1. 超全局不让用: $_GET
  2. $this
  3. 与当前参数重名不让用

1.5闭包经常用作函数的返回值

  1. function demo2($a)
  2. {
  3. // 返回一个函数,闭包最佳使用场景
  4. return function ($color) use ($a) {
  5. return sprintf('<h1 style="color:%s">%s</h1>', $color, $a);
  6. };
  7. }
  8. echo demo2('新时期最可爱的人!')('red');

闭包最佳使用场景一个返回函数

二、回调函数

1.call_user_func(“函数名”,函数参数);
2.call_user_func_array(“函数名”,函数参数列表);

  1. <?php
  2. // 回调执行
  3. function demo(string $name): string
  4. {
  5. return "welcome $name !";
  6. }
  7. echo demo('风萧萧兮易水寒'), '<hr>';
  8. // php单线程,同步执行,如果遇到耗时函数会发生阻塞,应该将它改为异步回调执行
  9. // call_user_func(函数,参数列表)
  10. echo call_user_func('demo', '书香蓝郡'), '<hr>';
  11. // call_user_func_array(函数,[参数数组])
  12. echo call_user_func_array('demo', ['书香蓝郡']), '<hr>';

图示:
回调函数显示结果

三、参数调用

1.必选参数:在函数调用时,必须传参
2.默认参数:参数有默认值,函数调用可以不传参
3.可选参数:参数数量不定;函数调用时传几个用几个,类似JS种的剩余参数
4.引用参数:参数前面加&引用符,引用参数,可以不用return直接实时改变函数外部的变量

3.1必选参数

  1. <?php
  2. // 1. 必选参数
  3. function demo1(string $name): string
  4. {
  5. return "welcome $name !";
  6. }
  7. echo demo1('百度总裁李彦宏'), '<br>';
  8. // 将标量(单值)会自动转为字符串
  9. echo demo1(996), '<br>';
  10. echo demo1(true), '<br>';

图示:
必选参数

3.2 不定参数

  1. <?php
  2. // 不定参数
  3. function user()
  4. {
  5. // 通过函数中内置的三个函数获取到参数的全部信息
  6. // 1. 参数有几个?
  7. $n = func_num_args();
  8. //2. 参数组成的数组
  9. $args = '[ ' . implode(', ', func_get_args()) . ' ]';
  10. // 3. 获取某一个参数
  11. // $arg = func_get_args()[3];
  12. $arg = func_get_arg(3); // func_get_args()[3]
  13. printf('参数数量: %d<br>参数数组: %s<br>第1个参数: %s<br>', $n, $args, $arg);
  14. // 求和
  15. // $res = 0;
  16. // for ($i = 0; $i < func_num_args(); $i++) {
  17. // $res += func_get_args()[$i];
  18. // }
  19. // echo '和'. $res;
  20. echo '参数之和: ' . array_sum(func_get_args());
  21. }
  22. user(2, 3, 4, 5, 6, 7, 8);

图示:
// 不定参数

3.3可选参数

  1. <?php
  2. // 可选参数
  3. function user(string $name = 'www.baidu.com'):string
  4. {
  5. return "welcome $name !";
  6. }
  7. echo user(), '<br>';
  8. echo user('百度总裁李彦宏');

图示:
可选参数

3.4引用参数:

引用参数
js函数参数只支持值传递
php支持“值传递”和“引用传递”
默认就是值传递,上面全是
引用传参: 在函数内部对参数的任何更新都会实现映射到外部的参数中

  1. <?php
  2. $name = '红高粱';
  3. // 引用传参在参数前使用: &
  4. function user(string &$name)
  5. {
  6. $name = '战狼2';
  7. }
  8. echo "\$name = $name<br>";
  9. user($name);
  10. echo "\$name = $name<br>";

图示:
引用参数

四、函数多值返回类型

函数的返回值
函数只允许有一个返回值
原则: “单值返回”
返回多值怎么办? 只能在返回值的类型上打主意

4.1函数数组返回值-数组

  1. <?php
  2. // 1. 数组
  3. function user(): array
  4. {
  5. return ['namae' => '天蓬老师', 'age' => '18','mail'=>'tp@php.cn'];
  6. }
  7. var_dump(user());

图示:
函数数组返回值-数组

4.2函数对象返回值-对象

  1. <?php
  2. //函数返回值-对象
  3. function user(): object
  4. {
  5. //创建一个匿名类返回
  6. return new class()
  7. {
  8. public $name = '天蓬老师';
  9. public $age = 18;
  10. public $mail ='tp@php.cn';
  11. };
  12. }
  13. //把函数赋给一个变量
  14. $user = user();
  15. //使用变量调用
  16. var_dump($user);
  17. //调用对象中的一个元素
  18. echo $user->mail;

图示:
函数对象返回值-对象

4.3函数对象返回值-序列化的字符串
1.php内置的序列化函数

如果有一些数据需要进行网络传输或保存到文件或数据表中的时候要用到它
如果这个序列化的数据只在php程序中使用,应该使用php内置的方法就可以了

  1. <?php
  2. // 内置的序列化函数
  3. function user(): string
  4. {
  5. return serialize(['status' => 1, 'message' => '验证成功']);
  6. }
  7. $str = user();
  8. echo $str;
  9. // file_put_contents('file.txt', $str);
  10. // 在php中使用时要还原成原来的类型
  11. $arr = unserialize($str);
  12. var_dump($arr);
  13. echo '<hr>';

图示:
内置的序列化函数

2.转为通用的json格式的字符串
这样就可以与其它编程语言进行数据交换,例如与前端js,java,python…

  1. <?php
  2. function user1(): string
  3. {
  4. return json_encode(['status' => 1, 'message' => '验证成功'], JSON_UNESCAPED_UNICODE);
  5. }
  6. $str = user1();
  7. echo $str;
  8. // 如果当前脚本接收到一个前端或其它接口发送过来的json格式的数据,可以进行解析
  9. // 解析的目的是将外部的json还原成php能够处理的数据类型
  10. $res=json_decode($str);
  11. var_dump($res);
  12. echo '<br>';
  13. // 默认将外部的json解析成object对象类型
  14. printf('status = %d, message = %s<hr>',$res->status, $res->message);

转为通用的json格式的字符串

3.转为通用的json格式的字符串也可用数组方式

  1. <?php
  2. // 给 json_decode()传入第二个参数 : true
  3. $res=json_decode($str, true);
  4. var_dump($res);
  5. echo '<br>';
  6. printf('status = %d, message = %s<hr>',$res['status'], $res['message']);

图示:
转为通用的json格式的字符串也可用数组方式

五、静态变量

  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();

更多相关文章

  1. 函数基础语法,函数进阶
  2. php常用数组函数以及数组的交集,差集,并集
  3. php学习笔记(函数相关_作用域_闭包_回调_多指返回)
  4. 细解php函数
  5. 认识函数的类型、参数与返回值
  6. 如何取消 JavaScript 中的异步任务
  7. 用函数式编程在 JS 中开发游戏
  8. php常用运算符、条件分支、循环、及文件引入
  9. JavaScript 执行线程图解

随机推荐

  1. php array_chunk函数用法介绍(实例)
  2. php如何实现网页常见文件上传功能
  3. 学习PHP实现的曲线统计图表示例
  4. PHP filesize() 函数
  5. 基于PHP微信网页获取用户信息的实例分析
  6. 基于canvasJS在PHP中制作动态图表详解
  7. 一文读懂php设计模式之代理模式
  8. PHP下ajax跨域的解决方案之window.name实
  9. 解析PHP生成图表pChart的示例
  10. 一文读懂简单工厂、工厂方法、抽象工厂