博客列表 >php 函数知识点概论

php 函数知识点概论

鸿运当头郭小胖
鸿运当头郭小胖原创
2020年04月22日 15:34:56990浏览

函数

理论基础说明

1. 语法

函数是实现代码复用的重要方式,在所有编程语言中均如此

  1. function 函数名称(类型: 参数列表): 返回值类型
  2. {
  3. // 函数体
  4. return 返回值;
  5. }
序号 名称 描述
1 function 声明函数
2 函数名称 符合 PHP 标识符命名规范,不区分大小写
2 参数列表 零个或多个接收外部传入到函数的变量
2 {... 创建出一个封闭的函数作用域
2 函数体 由零个可多个合法的 PHP 语句组成
2 return 值 将执行结果返回函数调用者[可选]
2 ...} 函数执行结束,如果没有return,则返回null

2. 类型

序号 类型 语法 描述
1 自定义函数 function getName(){...} 用户根据业务需求创建
2 系统函数 substr(), count()... 也叫预定义函数,不必声明直接调用
3 可变函数 $funcName(); 函数名使用变量表示
4 匿名函数 $f = function (){...} 也叫”闭包”或”函数表达式”,常用做回调处理

3. 返回值

  • 函数必须要有返回值
  • 函数必须是遵守单值返回原则
序号 场景 描述
1 return 可以返回任何类型的值,包括函数类型
2 return 遇到}也会返回, 默认返回null
  • 如果需要返回多个值,可以通过以下手段
序号 返回值类型 描述
1 string 字符串拼接
2 array 数组
3 json JSON 字符串
4 serialize 序列化字符串

json 和序列化,使用时需要进行解码操作


4. 参数

  • 调用者可以通过参数将数据传递到函数中
  • 参数是以逗号分隔的表达式列表
  • 参数按照从左到右的顺序求值

参数类型

序号 类型 描述
1 值参数 默认传参方式
2 引用参数 改变原始调用参数值
3 默认参数 调用时允许省略的参数
4 剩余参数 调用参数数量不确定

5. 回调函数

语法 类型 执行方式 应用场景
匿名函数 闭包Closure 异步 函数参数

异步执行,是指当前函数的执行并不会中断当前程序的执行流程


6. 命名空间

  • 使用目录来整理文档, 允许将同名文档,存储在不同的目录下面即可
  • 不同目录下的同名文件,访问时必须带上的它的目录名称,以未区别
  • 命名空间采用类似的思想,同名函数,只要声明在不同空间中即可
  • 同样, 访问这些函数时, 也需要带上它的命名空间才可以

代码小示例

可变函数、系统函数和匿名函数

  1. <html>
  2. <head>
  3. <meta charset="utf-8">
  4. <title>金额换算</title>
  5. </head>
  6. <body>
  7. <?php
  8. // 定义变量
  9. $discount = $_POST['discount'];
  10. $money = $_POST['money'];
  11. $num = $_POST['num'];
  12. $f = function ($discount) {
  13. // 子函数
  14. return function (float $money, float $num) use ($discount) : float
  15. {
  16. $amount = $money * $num;
  17. return $amount = $amount >= 2000 ? $amount * $discount : $amount;
  18. };
  19. };
  20. ?>
  21. <form method="post">
  22. 单价: <input type="text" name="money">
  23. 数量: <input type="text" name="num">
  24. 折扣:<input type="text" name="discount">
  25. <input type="submit" value="提交">
  26. </form>
  27. <?php
  28. echo "<h2>您应付金额是:</h2>";
  29. echo $f($discount)($money,$num);
  30. ?>
  31. </body>
  32. </html>

匿名函数

通过JSON返回

  1. <?php
  2. function w_connct1() : string
  3. {
  4. // json_encode(): 将php数据编码为json格式的字符串返回
  5. return json_encode(['status'=>1, 'message'=>'成功']);
  6. }
  7. $data = w_connct1();
  8. echo $data;
  9. echo '<hr>';
  10. // 将json格式的字符串还原/解析为php对象/数组
  11. $var = json_decode($data, true);
  12. print_r($var);
  13. echo '<hr>';

JSON

通过序列化返回

  1. <?php
  2. //序列化返回
  3. function w_connct1() : string
  4. {
  5. return serialize(['status'=>1, 'message'=>'成功']);
  6. }
  7. echo w_connct1();
  8. // 反序列化才可以使用
  9. $arr =unserialize(w_connct1());
  10. printf('<pre>%s</pre>', print_r($arr,true));

序列化

值参数、引用传递

  1. <?php
  2. function demo1(float $arg) : float
  3. {
  4. return $arg *= 2;
  5. }
  6. $value = 800;
  7. echo demo1($value) , '<br>';
  8. // 在函数中改变了调用参数的值,但原始调用参数并没有发生变化
  9. echo $value;
  10. echo '<hr>';
  11. // 2. 引用传递
  12. function demo2(float &$arg) : float
  13. {
  14. return $arg *= 2;
  15. }
  16. $value = 800;
  17. echo demo2($value) , '<br>';
  18. // 如果在参数前面使用了取地址符,则会改变原始调用参数的值
  19. echo $value;
  20. echo '<hr>';
  21. // 3. 默认参数
  22. // 默认参数必须写在必选参数的后面
  23. function demo3(float $a, float $b, string $opt = '+' )
  24. {
  25. $res = 0;
  26. switch ($opt) {
  27. case '+':
  28. $res = "$a + $b = " . ($a + $b);
  29. break;
  30. case '-':
  31. $res = "$a - $b = " . ($a - $b);
  32. break;
  33. case '*':
  34. $res = "$a * $b = " . ($a * $b);
  35. break;
  36. case '/':
  37. $res = "$a / $b = " . ($a / $b);
  38. break;
  39. default:
  40. $res = '非法操作符';
  41. }
  42. return $res;
  43. }
  44. echo demo3(10, 20), '<br>';
  45. // echo demo3(10, 20, '*'), '<br>';
  46. // echo demo3(10, 20, '#'), '<br>';
  47. echo '<hr>';
  48. // 4. 剩余参数
  49. function demo4(float $a, float $b, float $c ) : float
  50. {
  51. return $a + $b + $c;
  52. }
  53. // 计算三个数之和
  54. echo demo4(1,2,3), '<br>';
  55. echo '<hr>';
  56. function demo5( )
  57. {
  58. // 参数数量
  59. // return func_num_args();
  60. // 根据索引返回指定的调用参数
  61. // return func_get_arg(2);
  62. // return func_get_args();
  63. $total = 0;
  64. // for ($i = 0;$i <func_num_args(); $i++ ) {
  65. // $total +=func_get_arg($i);
  66. // }
  67. // return $total;
  68. foreach (func_get_args() as $value) {
  69. $total +=$value;
  70. }
  71. return $total;
  72. }
  73. // echo demo5(3,4,7,8,24);
  74. print_r(demo5(3,4,7,8,24));
  75. echo '<hr>';
  76. // echo demo5(1,2,3,4,5,6,9,22,67), '<br>';
  77. // 使用剩余参数简化
  78. // ...: 参数归纳:
  79. function demo6(...$args ) : float
  80. {
  81. // return $args;
  82. return array_sum($args);
  83. // return array_product($args);
  84. }
  85. // print_r(demo6(3,4,7,8,24));
  86. // echo demo6(1,2,3,4,5,6,9,22,67), '<br>';
  87. // 调用参数
  88. $arr = [1,2,3,4,5,6,9,22,67];
  89. // ...:
  90. // 1. 用在函数的形式参数列表中,表示"收集",将多个离散的参数打包到一个数组中处理
  91. // 2. 用在函数的调用参数列表中,表示"展开",还原将一个数组展开成一个个离散的值
  92. print_r(demo6(...$arr));
  93. echo '<hr>';
  94. // $config = ['localhost', 'phpedu', 'uft8', '3306'];
  95. // $dsn = 'mysql:host=localhost;dbname=phpedu;charset=utf8;port=3306';
  96. // $db = [$dsn, $username, $password];
  97. // $pdo = new PDO(...$db);
  98. // 扩展知识
  99. $user[] = [100, '小红', 90];
  100. $user[] = [110, '小兰', 60];
  101. $user[] = [120, '小芬', 98];
  102. // 数组解包
  103. // js中解构赋值, php中也有解构
  104. foreach ($user as list($id, $name)) {
  105. printf('id=%s, name=%s<br>', $id, $name);
  106. }
个人问题

foreach的概念还是有点理解不透彻。还需要多加练习!

回调函数

  1. <?php
  2. # 回调函数:用在函数的回调参数中
  3. //回调:在将来某一时刻,或者某个事件发生时再执行
  4. //生成一个1-100共100个整数的数组
  5. // $data=[1,2,3,4,5,6,7,8,9,...,100];
  6. // $data = range(0, 99, 5);
  7. // // range(起始数字,结束数字,步长)
  8. // print_r($data);
  9. // 只返回当前数据中偶数
  10. $data = range(0, 99);
  11. print_r($data);
  12. //只返回偶数
  13. var_dump(4 % 2);
  14. echo ((4 % 2) == 0) ? '偶数' : '奇数';
  15. $res = array_map(function (int $item) {
  16. if ($item % 2 === 0) return $item;
  17. }, $data);
  18. // array_map(回调函数,数组)
  19. echo $res;
  20. printf('<pre?>%s</pre>', print_r($res, true));
  21. // 过滤空值/假值
  22. // array_filter仅返回结果为trus的数据
  23. $res = array_filter($res, function ($item) {
  24. return $item;
  25. });
  26. $res = array_values($res);
  27. printf('<pre>%s</pre>', print_r($res, true));

回调函数

命名空间

  1. <?php
  2. # 命名空间(相当于在不同的目录下)
  3. // 防止命名冲突
  4. // 全局成员:函数,常量,类,接口
  5. namespace ns1 {
  6. function demo1(): string
  7. {
  8. return __FUNCTION__;
  9. }
  10. }
  11. namespace ns2 {
  12. function demo1(): string
  13. {
  14. return __FUNCTION__;
  15. }
  16. }
  17. // 全局空间不需要名称
  18. namespace {
  19. echo \ns1\demo1();
  20. echo '<hr>';
  21. echo \ns2\demo1();
  22. }

总结

通过学习函数的概念以及函数基础知识点,算是已经对php的一个基本构成有了一个初步的了解了。但是,说实话,关于一些函数的作用以及方式,还是记不住。这个只能通过日后多加练习来进行记忆了!foreach的概念还是有点理解不透彻。每次写都得参考教案来进行书写,根本记不住!!脑子瓦特了!!!

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议