博客列表 >细说函数:类型、返回值、参数等

细说函数:类型、返回值、参数等

溪边小树
溪边小树原创
2020年04月22日 17:38:08507浏览

函数

[toc]

1. 语法

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

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

示例

  1. <?php
  2. // 函数语法
  3. // 二数求和
  4. //函数的声明
  5. function sum(float $a, float $b ):string
  6. {
  7. $total=$a+$b;
  8. // 显式
  9. return '求两个数之和:'."$a+$b=".$total;
  10. // 隐式: 结束大括号的时候会自动返回
  11. }
  12. // 函数调用: 按名称
  13. echo sum(30,60);
  14. echo '<hr>';
  15. echo sum(20.5,30.6);

2. 类型

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

示例

  1. <?php
  2. // 函数
  3. // 1. 自定义函数
  4. // 2. 系统函数
  5. // 3. 可变函数
  6. // 4. 匿名函数:
  7. // getPrice: 小驼峰命名法
  8. // get_price: 蛇形命名法
  9. // 命名函数
  10. function getPayment( float $number , float $money)
  11. {
  12. return $number*$money ;
  13. }
  14. echo '总价为: ' . getPayment(5, 35);
  15. echo '<hr>';
  16. // 2. 系统函数
  17. // function mb_substr(){
  18. // //....
  19. // }
  20. $str = '各省市复工复学注意事项';
  21. // 仅获取前7个字符
  22. echo mb_substr($str, 0, 7);
  23. echo '<hr>';
  24. // 3. 可变函数
  25. $totalFun = 'getPayment';
  26. echo '总价为: ' . $totalFun(20,35);
  27. echo '<hr>';
  28. // 4. 匿名函数: 闭包, 可以访问父作用域的变量
  29. $discount = 0.6;
  30. // $discount 的作用域是全局
  31. $getAmount = function (float $money, int $num) use ($discount) : float
  32. {
  33. $amount = $money * $num;
  34. return $amount >= 2000 ? $amount * $discount : $amount;
  35. };
  36. echo '实付金额: ' . $getAmount(100, 20);
  37. echo '<hr>';
  38. // 如果父作用域又是一个函数
  39. $f = function ($discount) {
  40. // 子函数
  41. return function (float $money, int $num) use ($discount) : float
  42. {
  43. $amount = $money * $num;
  44. return $amount >= 2000 ? $amount * $discount : $amount;
  45. };
  46. };
  47. //$a = var_dump($f(0.6));
  48. //echo gettype( $f);
  49. //$tmp = $f(0.6);
  50. //echo '实付金额: ' .$tmp(200, 20);
  51. echo '实付金额: ' .$f(0.6)(200, 20);
  52. // 200 * 20 = 4000 * 0.6 = 2400

3. 返回值

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

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

示例

  1. <?php
  2. // 返回值
  3. // 原则: 单值返回
  4. // 如果需要返回多值
  5. // 1. 字符串拼装
  6. // 2. 数组
  7. // 3. JSON字符串
  8. // 4. 序列化: 字符串
  9. // 1. 字符串拼装
  10. function test():string
  11. {
  12. $password=123;
  13. $result='验证通过,允许登录';
  14. return $password .';' . $result;
  15. }
  16. echo test();
  17. echo '<hr>';
  18. // 适合处理大量的php+html混写
  19. // 这种返回的格式是用户自定义的,前端处理非常麻烦
  20. // 2. 通过数组
  21. function test2() : array
  22. {
  23. return ['password'=>123, 'result'=>'验证通过,允许登录'];
  24. }
  25. // echo '<pre>'.print_r(demo2(), true).'</pre>';
  26. $res = print_r(test2(), true);
  27. printf('<pre>%s</pre>', $res);
  28. echo test2()['password'] == 1 ? '<span style="color:green">'.test2()['result']. '</span>' : '验证失败';
  29. echo '<hr>';
  30. // 3. 通过JSON返回
  31. // json: 是用js对象字面量的方式来表示数据,是一种轻量级通用的数据交换或传输格式
  32. // json本质上就是一个具有一定结构和格式的字符串, 不过这种格式得到了公认,几乎所有编程语言都有支持它的接口
  33. function test3() : string
  34. {
  35. // json_encode(): 将php数据编码为json格式的字符串返回
  36. return json_encode(['password'=>123, 'result'=>'验证通过,允许登录']);
  37. }
  38. $data = test3();
  39. echo $data;
  40. // 将json格式的字符串还原/解析为php对象/数组
  41. $var = json_decode($data, true);
  42. print_r($var);
  43. echo '<hr>';
  44. // 4. 通过序列化返回多个值
  45. // 其实json也是一种序列化
  46. function test4() : string
  47. {
  48. return serialize(['password'=>123, 'result'=>'验证通过,允许登录']);
  49. }
  50. echo test4();
  51. // 反序列化才可以使用
  52. $arr =unserialize(test4());
  53. printf('<pre>%s</pre>', print_r($arr,true));

4. 参数

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

参数类型

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

示例

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

5. 回调函数

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

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


6. 命名空间

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

课程学习小结

本次课程详细介绍了函数类型、返回值、参数等相关知识,老师用归纳和实例的方式讲解了对应内容,主要有以下几个方面:
函数的类型:

  1. 自定义函数
  2. 系统函数
  3. 可变函数
  4. 匿名函数

函数的返回值:
原则: 单值返回,如果需要返回多值,可按以下方式进行

  1. 字符串拼装
  2. 数组
  3. JSON字符串
  4. 序列化: 字符串

函数参数:

  1. 值参数
  2. 引用参数
  3. 默认参数
  4. 剩余参数
    以上内容老师总结为3个“四”,方便我们记忆,通过课后的视频回看复习及案例代码模仿练习,进一步加深了理解。
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议