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

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

程序员文章站 2022-04-17 18:55:52
...

匿名函数/闭包/引用/超全局函数示例
全局变量在无传值的情况下,不能直接使用,除非下列几种情况
其中在匿名函数无传值情况下,我使用了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;

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

下面也是函数的示例
下面的函数的实例中,使用了命名空间函数,以及使用了查找作用于内有无当前的函数的函数
命名空间使用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. }

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

函数的返回值及数组=>json 及 json=>数组转换
json_encode(数组)用来把数组转换成json
json_decode(json,true)用来把json转换成数组
file_get_contents("请求api的url") 请求api
file_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. }

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

匿名函数的回调,传值
匿名函数的闭包回调传值,其实看完下面的意思 特别明确,就是封装一个函数,封装好后,在需要的时候,直接拿过来用,比如下面的$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']));