博客列表 >函数类型与返回值

函数类型与返回值

王佳祥
王佳祥原创
2020年07月08日 10:49:181955浏览

函数类型与返回值

一、函数的声明与调用

  • 函数语法:
  1. function 函数名称的标识符(参数列表){
  2. //函数体,由一条或多条语句组成,也可以为空
  3. }
  4. 标识符:必须满足php标识符的基本要求,只允许字母数字或下划线不允许用数字开头
  5. 函数:代码复用的重要手段
  6. 变量:数据复用的重要手段
  • 自定义函数的声明与调用
  1. //声明
  2. function sum(int $a,int $b):int
  3. {
  4. //return :将函数的执行结果返回到调用者
  5. return $a + $b;
  6. }
  7. //调用
  8. echo sum(100,100);


二、函数的类型

1.自定义函数

  1. //1.自定义函数
  2. function getPrice(float $money,float $discount):float
  3. {
  4. return $money * $discount;
  5. }
  6. echo '实付金额 = ' . getPrice(5000,0.6),'<hr>';


2.系统函数

  1. //2.系统函数
  2. $str = "函数调用机制,改进函数调用机制,通过优化参数传递环节,减少了一些指令";
  3. //字符串截取
  4. //echo '字符串截取mb_substr()系统函数:' . mb_substr($str,0,6),'<hr>';


3.可变函数

  1. //3.可变函数
  2. $funcName = 'getPrice';
  3. echo '(可变函数)实付金额 = ' . $funcName(5000,0.6),'<hr>';


4.匿名函数

  1. //4.匿名函数
  2. //拥有名称的函数叫:命名函数/具名函数
  3. $get = function(float $money,float $discount):float
  4. {
  5. return $money * $discount;
  6. };
  7. echo '(匿名函数)实付金额 = ' . $get(10000,0.6),'<hr>';


  1. <?php
  2. //匿名函数,也叫闭包函数,允许临时创建一个没有指定名称的函数。最经常用作回调函数参数的值
  3. //闭包函数也可以作为变量的值来使用
  4. //闭包可以从父作用域中继承变量,任何此类变量都应该用 use 语言结构传递进去
  5. //父作用域就是父函数
  6. $f = function($discount){
  7. $p = function (float $money,int $n) use ($discount):float
  8. {
  9. $total = $money * $n;
  10. return ($total > 20000) ? ($total * $discount) : $total;
  11. };
  12. //将子函数以返回值的方式返回给调用者
  13. return $p;
  14. };
  15. echo '实付金额 = ' . $f(0.8)(3000,10),'<hr>';


三、函数的返回值

  1. <?php
  2. //函数必须要有返回值
  3. //函数只能返回单一的值
  4. function f()
  5. {
  6. }
  7. var_dump(f());
  8. echo '<hr>';
  9. //返回多值
  10. //1.通过字符串拼装
  11. function demo1():string
  12. {
  13. $status = 1;
  14. $message = '成功';
  15. return $status.','.$message;
  16. }
  17. echo '字符串拼装:'.demo1(),'<hr>';
  18. //通过数组返回
  19. function demo2():array
  20. {
  21. $status = 1;
  22. $message = '成功';
  23. return ['status' => $status, 'msg' => $message];
  24. }
  25. echo '数组返回:'.demo2()['msg'],'<hr>';
  26. //3.json:是js对象字面量的字符串表示
  27. function demo3():string
  28. {
  29. $status = 0;
  30. $message = '成功';
  31. return json_encode(['status' => $status, 'msg' => $message]);
  32. }
  33. echo 'js对象字面量的字符串表示:'.demo3(),'<br>';
  34. $data = json_decode(demo3(),true);
  35. print_r($data);
  36. echo '<hr>';
  37. //4.序列化方式
  38. echo serialize([1,2,3]),'<br>';
  39. function demo4():string
  40. {
  41. $status = 1;
  42. $message = '成功';
  43. return serialize(['status' => $status, 'msg' => $message]);
  44. }
  45. echo '序列化:'.demo4(),'<br>反序列化:';
  46. print_r(unserialize(demo4()));


四、函数的参数

  1. <?php
  2. //函数中的参数
  3. //1.值参数,这是默认
  4. function demo1(float $arg): float
  5. {
  6. return $arg *= 2;
  7. }
  8. $val = 100;
  9. echo '原来的值:'.$val,'<br>';
  10. echo '值参数:'.demo1($val),'<br>';
  11. echo '现在的值:'.$val,'<hr>';
  12. //2.引用参数,要在参数前添加取地址符&
  13. function demo2(float &$arg):float
  14. {
  15. return $arg *= 2;
  16. }
  17. $val = 100;
  18. echo '原来的值:'.$val,'<br>';
  19. echo '引用参数:'.demo2($val),'<br>';
  20. echo '现在的值:'.$val,'<hr>';
  21. //3.默认参数
  22. //凡是有默认值的参数,必须写到没有默认值参数的后面
  23. function demo3(float $a=2,float $b=4,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(),'<br>';
  45. echo '不传操作符:'.demo3(100,100),'<br>';
  46. echo '传参数:'.demo3(100,5,'*'),'<br>';
  47. echo '传错参数:'.demo3(100,5,'#'),'<hr>';
  48. //4.剩余参数
  49. function add($a,$b,$c)
  50. {
  51. return $a + $b +$c;
  52. }
  53. echo add(1,2,3),'<br>';
  54. //剩余参数用在函数的参数列表中:收集
  55. function add1(...$s)
  56. {
  57. return array_sum($s);
  58. }
  59. //调用参数数量不固定
  60. //将剩余参数用在函数的调用表达式中,是:展开
  61. $arr = [1,2,3,4,5,6,7,8,9];
  62. $res = add1(...$arr);
  63. print_r($res);


五、回调函数

  1. <?php
  2. //回调函数,匿名函数,闭包
  3. //异步编程中的函数的参数
  4. $data = range(1,100);
  5. $arr = array_map(function($item){
  6. //array_map — 为数组的每个元素应用回调函数
  7. if($item % 2 === 0) return $item;
  8. },$data);
  9. print_r($arr);
  10. //过滤掉空值
  11. $res = array_filter($arr,function($item){
  12. //array_filter — 用回调函数过滤数组中的单元
  13. return $item;
  14. });
  15. print_r(array_values($res));
  16. //array_values() 返回 input 数组中所有的值并给其建立数字索引



六、带有命名空间的函数

  1. <?php
  2. //函数的命名空间
  3. //只要用到命名空间,全部代码都要用命名空间
  4. namespace ns1{
  5. function demo1(){return '命名空间1';}
  6. }
  7. namespace ns2{
  8. function demo1(){return '命名空间2';}
  9. }
  10. //全局空间:匿名空间,默认空间
  11. namespace{
  12. function demo1(){return '命名空间3';}
  13. echo \ns1\demo1();
  14. }


七、学习总结

1.函数的声明与调用

  • 声明:function 函数名(){}

  • 调用: echo 函数名();

  • 函数名:由字母数字下划线组成,不能以数字开头

2.函数类型

  • 自定义函数

  • 系统函数,系统预定义的函数,不需要自己定义

  • 可变函数,把函数名赋值给一个变量,通过变量来调用

  • 匿名函数,也叫闭包函数,临时创建一个没有指定名称的函数,经常用作回调函数参数的值

3.函数的返回值

  • 函数必须要有返回值,没有返回值会出错

  • 函数不能返回多个值,但可以通过返回一个数组、字符串拼接、js对象字面量的字符串、序列化方式来得到类似的效果

  • json_encode([]);通过js对象字面量的字符串来表示

  • serialize([]);通过序列化方式来表示 unserialize反序列化

4.函数的参数

  • 值传递参数(默认)

  • 引用传递参数 ,在函数定义中参数的前面加上符号 &

  • 凡是有默认值的参数,必须写到没有默认值参数的后面

  • 剩余参数用在函数的参数列表中是:收集,用在函数的调用表达式中是:展开

  • …表示多个参数 array_sum()求数组所有元素的和

5.回调函数

  • 回调函数,匿名函数,闭包

  • array_map — 为数组的每个元素应用回调函数

  • array_filter — 用回调函数过滤数组中的单元

  • array_values() 返回 input 数组中所有的值并给其建立数字索引

6.函数的命名空间

  • 只要用到命名空间,全部代码都要用命名空间

  • namespace 命名空间名称 {}

  • namespace {} 全局空间:匿名空间,默认空间

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