博客列表 >函数的定义和调用,函数的参数,函数的返回值,匿名函数(闭包)的申明和调用

函数的定义和调用,函数的参数,函数的返回值,匿名函数(闭包)的申明和调用

刚哥哥
刚哥哥原创
2021年01月31日 21:15:581108浏览

概念总结

  1. 函数: php中可分为php内置函数和用户自定义函数,
  2. // 函数可以理解为 能够实现某个功能的代码块,时代码重用的一个手段;函数在定义的时候不会执行,在调用的时候才会执行;
  3. // 函数的申明,通过 function 关键字开头 ,函数名通过 下划线'_' 字母开头,函数名对大小写不敏感;
  4. // 函数具有返回值,通过 return 返回,函数只有一个返回值,如果要返回多个值,可以返回 数组、对象(匿名类方式)、或json 字符串
  5. //函数具有参数, 在函数调用的时候传入的参数 叫做实际参数,函数名后面的产生 称为形式参数,用于接收实际参数,
  6. // 函数的参数默认时通过值传递的方式,在函数内部对参数的改变不会影响函数外面的参数的值;
  7. //如果须要改变函数外面参数的值,可以通过引用的方式传参,在形参前面加一个取地址符 & ;function getName(&$name){}
  8. //函数 的作用域: 函数
  9. // 闭包: php 官方手册给出的定义是: 闭包函数就是匿名函数; 就是没有函数名(标识符)的函数,它可以赋值给一个变量,通过变量名调用,
  10. // 闭包最常用的 场景就是,作为函数的返回值返回,后赋值给一个变量,再进行使用。
  11. // 闭包可以冲父作用域中继承变量,但是 要 使用 use 关键字传递进去,
  12. // use 不能用于一下情形: 超全局变量、$this、 当前函数参数同名的变量;
  13. // 函数 的作用域: php函数内定义的变量属性函数内,称为局部作用域,函数外申明的变量称为全局作用域;
  14. // php中作用域不重叠,函数内部不能访问函数外部的变量(可通过global关键字或$GLOBALS超全局变量访问),函数内申明的变量不能在函数外访问,预定义的超全局变量可以在整个脚本使用

代码演示

  1. $a = 456;
  2. // 函数申明和函数作用域
  3. function getName()
  4. {
  5. $a = 789;
  6. echo $a;
  7. }
  8. echo $a; // 输出456
  9. echo '<hr>';
  10. getName(); //输出 789
  11. //通过实例我们可以看出函数内部不能直接使用函数外部的全局变量
  12. function getName1()
  13. {
  14. //通过global 关键字使用函数外部全局变量
  15. global $a;
  16. $a = 999;
  17. echo $a . '<br>';
  18. }
  19. getName1();
  20. echo $a;
  21. $a = 80;
  22. echo $a;
  23. // globla 关键字是直接引用(引用传值)函数外部的全局变量到函数内部使用,如果从新赋值,会改变变量初始
  24. echo '<hr>';
  25. $b = 5678;
  26. function getName2()
  27. {
  28. //通过超全局变量 $GLOBALS 在函数内部访问函数外部的全局变量
  29. $c = $GLOBALS['b'];
  30. $c = 5680;
  31. return $c += 2;
  32. }
  33. echo getName2();
  34. echo $b;
  35. //通过超全局变量 $GLOBALS 在函数内部使用全局变量,在函数内对变量进行重新赋值,不会改变原变量数据
  36. echo '<hr>';
  37. //函数内 静态变量 static 关键字定义:静态变量在函数调用执行后不会立即释放内存,可以保持该变量的值,
  38. function getName3()
  39. {
  40. // static $num = 0;
  41. for ($num = 0; $num <= 100; $num++) {
  42. echo $num . '<br>';
  43. }
  44. }
  45. getName3(); // 输出0-100 的整数;这个例子没有举对;
  46. echo '<hr>';
  47. function getNum($u)
  48. {
  49. static $n = 0; //每调用一次函数 就更新一下$n
  50. $n++;
  51. echo "\$n自身的值:$n" . '<br>';
  52. return "\$n和\$u相加后的和:$n + $u =" . ($n + $u) . '<br>';
  53. }
  54. echo getNum(1); // 输出2
  55. echo getNum(1); // 输出3
  56. echo getNum(1); // 输出4
  57. echo getNum(1); // 输出5
  58. echo '<hr>';
  59. //函数外部访问函数内部变量;
  60. //(这个逻辑是错误的,因为函数内的代码块是在函数调用执行的时候才创建,函数执行完毕后就没有了,所以在函数外部是访问不到函数内部的变量的,只有在函数执行的时候,把须要的值通过返回值的方式获得,)
  61. function getColor()
  62. {
  63. static $color = 'red';
  64. }
  65. //调用函数
  66. getColor();
  67. echo $color; //没有任何输出,因为函数内申明的变量, 是局部变量,不能在函数外面使用,
  68. var_dump($GLOBALS['color']); //通过$GLOBALS 超全局变量 也不能直接获取函数内部申明的局部变量
  69. // 上面 输出 : NULL
  70. global $color;
  71. echo $color . '<br>';
  72. var_dump($color); // 同 $GLOBALS 一样 输出NULL
  73. getColor();
  74. echo '<hr>';
  75. function getColor1()
  76. {
  77. $color = 'red';
  78. return $color; //要获取函数内部申明的局部变量 可以通过 函数返回值的方式
  79. }
  80. echo getColor1(); // 输出 red;
  81. echo "<hr>";
  82. // 递归 : 函数自己调用自己
  83. function myExe()
  84. {
  85. static $a = 0; //申明一个静态变量
  86. $a++;
  87. if ($a <= 10) {
  88. echo "\$a等于$a" . '<br>';
  89. myExe();
  90. }
  91. }
  92. myExe();
  93. echo "<hr>";
  94. //函数的参数
  95. //可分为: 必填参数、选填参数(就是函数的形参有默认值,)不定参数(假定在不知道参数个数的情况下使用 ... ,可以把多个参数集合到一个数组中)
  96. // 必填参数
  97. function show($a)
  98. {
  99. echo $a;
  100. }
  101. //show();// 如果不传参数会报错
  102. show('hello 如来');
  103. echo '<hr>';
  104. //选填参数
  105. function show1($a = '我是观音姐姐')
  106. {
  107. echo $a;
  108. }
  109. show1(); // 由于形参有 默认参数,所以在调用函数的时候不传参数 ,函数也是可以正常执行的,
  110. echo "<hr>";
  111. show1('我是观音姐姐的粉丝');
  112. echo "<hr>";
  113. //不定参数
  114. function getSum(...$arr)
  115. {
  116. //php 预定义函数 array_sum() 函数,专门用于数组求和
  117. return array_sum($arr);
  118. }
  119. echo getSum(10, 20, 30, 40, 50, 60,);
  120. echo "<br>";
  121. echo getSum(10, 20, 30);
  122. echo "<hr>";
  123. //闭包 :闭包 可以理解为匿名函数
  124. // 申明一个匿名函数 并赋值给变量$color,这个匿名函数 可以理解为$color 的值,{}后面须要写 分号,不然语法错误;调用的时候也用函数的方式调用;
  125. $color = function ($a, $b) {
  126. return $a + $b;
  127. };
  128. echo $color(5, 2);
  129. echo "<hr>";
  130. //闭包(匿名函数) 可以继承父作用域的 变量,使用 use 关键字 引入父作用的变量,
  131. // use 关键字不能引入 :$this 、 函数形参变量名相同的变量 、 php超全局变量
  132. $ab = 10;
  133. $abc = 81;
  134. $summ = function ($a, $b) use ($ab, $abc) {
  135. echo $a + $b + $ab + $abc;
  136. };
  137. $summ(5, 4);
  138. echo "<hr>";
  139. // 闭包中的引用传值
  140. $col = 'red';
  141. $color = function (&$col) {
  142. $col = $col;
  143. echo $col . '<br>';
  144. $col = 'blue';
  145. echo $col . '<br>';
  146. };
  147. $color($col);
  148. echo '<br>';
  149. echo "在函数内从新赋值后的全局变量:\$col 值等于:$col";
  150. echo '<hr>';
  151. //回调异步执行函数 call_user_func_array(函数,[函数参数数组形式])
  152. function getUser($user)
  153. {
  154. return $user .= '生活在伟大的中华人民共和国,他乐观、积极并且乐于助人';
  155. }
  156. echo getUser('小明'); //正常调用
  157. echo '<hr>';
  158. echo call_user_func_array('getUser', ['小红']);
  159. echo "<hr>";
  160. //函数返回值
  161. // 函数只能返回一个值:如果要返回对个值,可以改变返回值的数据类型, 改为数组、对象(通过匿名类)、json 等
  162. // 返回单个值
  163. function getAge($age)
  164. {
  165. return $age; //直接返回
  166. }
  167. echo getAge(66); //返回单个值
  168. echo '<hr>';
  169. // 通过数组形式 返回多个值
  170. function getAge1(...$age)
  171. {
  172. $ages[] = $age;
  173. // $ages[] = 100;
  174. return $ages; //返回数组
  175. }
  176. var_dump(getAge1(11, 33, 44));
  177. echo '<hr>';
  178. function getAge2($a, $b, $c)
  179. {
  180. $ages[] = $a;
  181. $ages[] = $b;
  182. $ages[] = $c;
  183. // $ages[] = 100;
  184. return $ages; //返回数组
  185. }
  186. var_dump(getAge1(11, 33, 44)); // 返回的是一个二维数组
  187. echo '<hr>';
  188. // 通过对象(匿名类的方式)的形式返回对个值
  189. function getAge3()
  190. {
  191. return new class()
  192. {
  193. public $name = '御弟哥哥';
  194. public $age = 1000;
  195. }; // 匿名类后面的 花括号 要加分号 结束;
  196. }
  197. //把返回的对象 用一个变量接收
  198. $obj = getAge3();
  199. echo $obj->name;
  200. echo '<br>';
  201. echo $obj->age;
  202. echo '<hr>';
  203. //通过 json 格式 返回多个值
  204. function getUser4(): string
  205. {
  206. $users = ['id' => '1', 'name' => '包租婆', 'age' => '50', 'sex' => '女'];
  207. return json_encode($users, JSON_UNESCAPED_UNICODE);
  208. // return json_encode(['id' => '1', 'name' => '包租婆', 'age' => '50', 'sex' => '女'], JSON_UNESCAPED_UNICODE);
  209. }
  210. $users = getUser4();
  211. var_dump($users);
  212. echo $users;
  213. echo '<hr>';
  214. //通过 json_decode()函数 把 json数据 解析并赋值到变量
  215. //解析之后 默认是对象方式调用;
  216. $user = json_decode($users);
  217. echo $user->id;
  218. echo $user->name;
  219. echo '<hr>';
  220. //json_decode() 函数 默认以对象方式返回,如果想以数组的方式返回数据,须要使用第二个参数,设置为true
  221. $user = json_decode($users, true);
  222. var_dump($user);
  223. echo '<br>';
  224. echo $user['id'];
  225. echo $user['name'];
  226. echo $user['sex'];
  227. echo '<hr>';
  228. //通过php内置序列化函数返回多个值
  229. // serialize() 函数 (序列化)产生一个可存储的值的表示,(不说人话),返回一个脂字符串,可用于储存在任何地方。
  230. // 这有利于存储或传递php的值,同时不丢失其类型和结构。
  231. //resource 类型不能不序列化,其他类型都可以被序列化
  232. // unserialize() 函数 (反序列化) 将已经序列化的字符串变化php的值。
  233. function getRes()
  234. {
  235. $ress = ['id' => '1', 'name' => '黑熊精', 'age' => '10000', 'sex' => '公'];
  236. return serialize($ress); //将数组通过序列化成字符串的方式返回给函数,
  237. }
  238. $ress = getRes();
  239. var_dump($ress);
  240. echo '<hr>';
  241. //将被序列化为字符串的 php数据,转为正常的php 数据
  242. $res = unserialize($ress);
  243. var_dump($res);//打印反序列化后的数组
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议