ASCII码 ASCII码

php请求接口以及json和php中数组的转换,函数,匿名函数,匿名函数的闭包以及引用变量,更改变量的值,匿名函数的回调,

发布于:2022-01-21 10:55:40  栏目:技术文档

匿名函数/闭包/引用/超全局函数示例全局变量在无传值的情况下,不能直接使用,除非下列几种情况其中在匿名函数无传值情况下,我使用了use函数来引用了外部的变量以及使用超全局函数来引入外部的变量,超全局函数如下:$GLOBALS$_GET$_POST并且重新演示了 & 引入变量,更改引入变量的原始值代码示例:

  1. <?php
  2. /**
  3. * 函数属于全局成员
  4. * 特殊形式的函数
  5. * 1.匿名函数(闭包函数)
  6. * 2.回调函数
  7. * 3.递增函数
  8. */
  9. // 匿名函数输出要放到函数的后面
  10. // 强制home参数为字符串
  11. function home(string $name = '刘亦菲'): string
  12. {
  13. // var_dump($name);
  14. return "{$name},欢迎您来下榻喜来登酒店";
  15. }
  16. echo home('周润发');
  17. echo '<hr>';
  18. //匿名函数:通常会被当做回调函数的参数来使用
  19. $namehome = function ($name = '周润发') {
  20. return "{$name},欢迎下榻喜来登发财酒店";
  21. };
  22. echo $namehome();
  23. echo '<hr>';
  24. echo $namehome('刘亦菲');
  25. //闭包引来【变量】的作用于问题,输出【变量】只能放到函数的下面
  26. //全局变量是指声明在函数外部的变量,在函数的内部访问不到,需要传值,或use引用一下,或者使用超全局函数
  27. //局部变量是指声明在函数内部的变量,只能在函数内部被访问到。函数外部不可访问
  28. $name = '隔壁老王';
  29. $email = '123456789@qq.com';
  30. function loginemail()
  31. {
  32. $modify = '美丽的'; //局部变量
  33. // 当无参数时,使用全局变量时,需要用use引入传值,或者使用超全局函数,这里演示超全局函数
  34. // 1. global
  35. // 2. 超全局数组$GLOBALS $_GET $_POST
  36. // global $name, $email;
  37. // 使用超全局函数时,参数的值就是外部的变量
  38. return "尊敬的{$GLOBALS['name']}会员,欢迎{$modify}您注册我方邮箱,您的{$GLOBALS['email']}已注册成功,请立即登录";
  39. }
  40. echo '<br>';
  41. echo loginemail();
  42. echo '<hr>';
  43. //3.闭包函数借助关键字use来引入到函数中
  44. // 匿名闭包函数 用use引入传值
  45. $loginname = function ($modify) use ($name, $email) {
  46. return "尊敬的{$name}会员,欢迎{$modify}您注册我方邮箱,您的{$email}已注册成功,请立即登录";
  47. };
  48. echo $loginname('美丽的');
  49. //闭包改变变量上下文的值 需要引用传值
  50. $loginname = function ($newName) use (&$name) {
  51. $name = $newName;
  52. return $name;
  53. };
  54. echo '<hr>';
  55. echo $loginname('隔壁神仙'); //我在函数中ruturn回来了名字,看下返回的名字,是隔壁神仙,我又在下面输出了全局的name变量 ,有没有发现改变了原始值?
  56. //这是因为我使用&引用传值操作
  57. echo '<hr>';
  58. echo $name;

示例截图:

下面也是函数的示例下面的函数的实例中,使用了命名空间函数,以及使用了查找作用于内有无当前的函数的函数命名空间使用namespace来使用查找当前作用于中是否有其他的函数时使用function_exists("函数名") 来查找以及使用了查看本地时区的方法 使用date_default_timezone_get(),其中更改为set,查看为get以及时间函数date()代码如下:

  1. <?php
  2. /**
  3. * 函数是全局成员,不受作用域限制
  4. * php函数的作用:完成特定功能的代码块,封装成函数,可以实现复用性,提高代码的可维护性
  5. * php内置了上千种函数可供我们直接调佣,函数库文件已经编译到我们所使用的发行版中了,可以直接指定函数名称来调佣,当然我们也可以自定义函数来完成特定的功能
  6. * 函数的命名规则基本和变量的命名规则一直,可以以字母或下划线开头,后跟字母数字或下划线,但不能以数字开头,函数不区分大小写
  7. * 函数的有三大要素,参数,返回值,函数体
  8. *
  9. * php函数语法
  10. * function 函数名称 ([参数类型限定 参数列表]):返回值
  11. * {
  12. * 函数体
  13. * return 返回值
  14. * 1.函数只能返回单一的值,返回的值的数据类型可以是任意类型
  15. * 2.函数碰到return语句,立即结束程序的执行
  16. * return 后面的代码不会被执行
  17. *
  18. * }
  19. *
  20. */
  21. namespace qk1 {
  22. echo date_default_timezone_get(); //z获取的是默认时区地址,比如美国洛杉矶,中国上海
  23. //get是获取, set是修改 中国默认的参数值为PRC
  24. echo date('Y-m-d H:m:s');
  25. // 定义一个函数
  26. //规定返回的类型为string类型
  27. function home(string $name): string
  28. {
  29. return "{$name},欢迎回家,进门请换鞋";
  30. }
  31. echo home('战神');
  32. /**
  33. * 参数:可选的,对外提供一个接口,供函数调用者按照自己的意愿改变函数体内的执行行为
  34. * 参数分为形参 跟 实参
  35. * 默认参数:有默认值的参数,如果不传惨,或者少传参数,就会默认参数的值
  36. * 参数是从左往右求值的,所以默认参数放到最右边
  37. */
  38. function homedaypay($days, $homepay, $discount = 0.98)
  39. {
  40. $total = $days * $homepay * $discount;
  41. return $total;
  42. }
  43. echo '<hr>';
  44. echo homedaypay(5, 200);
  45. echo '<hr>';
  46. echo homedaypay(5, 200, 0.5);
  47. // function_exists()给已定义的函数返回true 没有定义的返回false
  48. echo '<hr>';
  49. var_dump(function_exists('homedaypay'));
  50. if (!function_exists('homedaypay')) {
  51. echo '没有函数'; //打印的时候没有打印出来,因为当前是有这个函数的
  52. }
  53. }
  54. // 同一个脚本下虽然不能存在同名函数,但是可以使用命名空间来做
  55. //namespace 命名空间,当声明命名空间的时候,命名空间外不允许有其他代码,必须是多个命名空间
  56. namespace qk2 {
  57. function homedaypay($days, $homepay, $discount = 0.98)
  58. {
  59. $total = $days * $homepay * $discount;
  60. return $total;
  61. }
  62. // 定义一个全局变量
  63. $days = 5;
  64. $homepay = 180;
  65. $discount = 0.8;
  66. // 当前不会改变全局的价格 除非导入到参数中,使用&导入
  67. echo homedaypay($days, $homepay, $discount);
  68. echo '<hr>';
  69. echo $homepay;
  70. }
  71. namespace qk3 {
  72. $days = 5;
  73. $homepay = 180;
  74. $discount = 0.8;
  75. function homedaypay($days, &$homepay, $discount = 0.98)
  76. {
  77. //相当于 当前的折扣0.8* 参数homepay的180 再赋值给homepay
  78. $homepay *= $discount;
  79. $total = $homepay * $days;
  80. return "尊敬的会员,您需要支付{$total}元";
  81. }
  82. echo '<hr>';
  83. // 在函数的参数中引用时,全局值将会改变,例如我运行完函数homedaypay时,最下面的homepay值将改变,如果不运行这个函数,就将不改变
  84. echo homedaypay($days, $homepay, $discount);
  85. echo '<hr>';
  86. echo $homepay;
  87. }

示例截图:

函数的返回值及数组=>json 及 json=>数组转换json_encode(数组)用来把数组转换成jsonjson_decode(json,true)用来把json转换成数组file_get_contents("请求api的url") 请求apifile_pul_contents("文件名路径"请求api的url")//请求别人的url直接将json储存在文件中拿过代码去不要看不懂,我在里面加了一个ob_clean(); 清除上部的文件执行,可以删掉之后访问试试下面的数据我已经遍历出来之后,输出到php页面中了代码示例:

  1. <?php
  2. // 函数的返回值
  3. function obj()
  4. {
  5. // return md5('5211314520'); //返回一组加密数据
  6. // return new stdClass();
  7. // return '1' === 1; //完全=1 false 可以用var_dump打印一下
  8. // return '1' == 1;
  9. return ['123', 321, '666888']; //用var_dump打印一下 echo直接出不来 可以转换成json用echo出来
  10. return 666;
  11. }
  12. echo json_encode(obj());
  13. var_dump(obj());
  14. //接口的开发 函数返回值会转为通用的json格式的数据返回,这样一来就可以与其他的编程语言进行数据的交互处理,例如json与php,js,java,python等等
  15. // 从juhe.com拿输出进行转换
  16. $loginarr = ['status' => 1, 'message' => '登录/成功'];
  17. //常用于登录
  18. // 记得一定要在函数的参数里面传值进去,直接在函数里面使用,是不行的
  19. function login($loginarr)
  20. {
  21. //json_encode将数组转成json
  22. //json_encode()第二个参数是一个常量,JSON_UNESCAPED_UNICODE(中文不转为unicode ,对应的数字 256),JSON_UNESCAPED_SLASHES (不转义反斜杠,对应的数字 64)
  23. return json_encode($loginarr, 320);
  24. }
  25. $loginstr = login($loginarr);
  26. echo $loginstr;
  27. ob_clean();
  28. // 接口的开发 将json转成数组
  29. // 用file_get_contents请求别人的json数据
  30. $res = file_get_contents(
  31. 'http://v.juhe.cn/toutiao/index?type=top&key=key'
  32. );
  33. // 储存文件到路径 使用file_put_contens('路径文件名',$res)
  34. //返回的是json数据
  35. // echo $res;
  36. // 对json数据进行数组化
  37. $resarr = json_decode($res, true);
  38. // var_dump($resarr);
  39. $arr = $resarr['result']['data'];
  40. foreach ($arr as $key => $value) {
  41. echo "<div>标题:{$value['title']}</div>
  42. <div>时间:{$value['date']}</div><div>网址:{$value['url']}</div><div>来源:{$value['author_name']}</div><br>";
  43. }

示例截图:

匿名函数的回调,传值匿名函数的闭包回调传值,其实看完下面的意思 特别明确,就是封装一个函数,封装好后,在需要的时候,直接拿过来用,比如下面的$odd声明的这个匿名函数,我需要的时候,在任何地方都可以使用他,这个函数就是一个筛选数组的偶数出来,重新装成数组,我想用的时候,直接调用即可,在$sumarr这个声明的函数里面,我声明了第一个参数为闭包函数,使用Closure声明,(偷偷告诉同学们,不声明也执行),声明第一个参数时一个函数,第二个参数时一个数组,我在后面传值的时候,直接$sumarr(函数,值)进去,ok了,还有匿名函数可以用call_user_func回调,命名函数可以用call_user_func_array来回调,注意,call_user_func_array第二个参数是一个数组,当然 他们第一个参数 都是一个函数,使用call_user_func_array时,第二个参数要以[]数组的方式存在.代码部分:

  1. <?php
  2. /**
  3. * 回调函数:php回调函数是指在主线程函数执行的过程中,突然跳去执行设置的回调函数,回调函数结束执行结束后,再回来执行主线程函数
  4. *
  5. * 匿名函数最通常作为回调函数的参数使用
  6. */
  7. //给到一个任意的数组,把数组中的偶数筛选出来,组成一个新的数组,返回,然后计算新数组的所有偶数的和
  8. $arr = [12, 24, 56, 108, 351, 246, 285, 344, 1065];
  9. $odd = function (array $arr) {
  10. // for循环遍历输出的长度,默认长度为0
  11. for ($i = 0; $i < count($arr); $i++) {
  12. // 如果数组内的值 也就是$i 能被2整除 则把$arr[$i]塞到$newarr[]数组里面
  13. if ($arr[$i] % 2 == 0) {
  14. $newarr[] = $arr[$i];
  15. };
  16. };
  17. return $newarr;
  18. };
  19. // 打印一下传入的值筛选出来之后的, 转成了json格式
  20. echo json_encode($odd($arr));
  21. //计算数组所有偶数的和
  22. // Closure声明第一个参数为闭包函数
  23. // 这个closure可以省略,在这里写这感觉怪怪的
  24. // $funt是函数, $arr是数组
  25. $sumarr = function (Closure $funt, $arr) {
  26. // 这里理解为调用$funt这个函数,传入$arr这个数组,计算之后的新数组赋值给$arrnew
  27. $arrnew = $funt($arr);
  28. // 然后用数组求和函数 array_sum求和返回
  29. return array_sum($arrnew);
  30. };
  31. echo newa(6, 5);
  32. echo "<hr>";
  33. echo $sumarr($odd, $arr);
  34. echo "<hr>";
  35. //声明一个命名函数后面用
  36. function newa($a, $b)
  37. {
  38. $c = $a + $b;
  39. return $c;
  40. };
  41. // 适用于匿名函数
  42. var_dump(call_user_func($odd, $arr));
  43. echo "<hr>";
  44. // call_user_func_array适用于命名函数
  45. var_dump(call_user_func_array('newa', ['6', '7']));
相关推荐
阅读 +