博客列表 >php 函数定义、类型、参数、返回值

php 函数定义、类型、参数、返回值

星夜低语
星夜低语原创
2020年04月21日 10:34:121466浏览

函数

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 (){...} 也叫”闭包”或”函数表达式”,常用做回调处理
  1. // getPrice: 小驼峰命名法
  2. // get_price: 蛇形命名法
  3. //1.自定义函数
  4. function getPrice(float $money, float $discount) : float
  5. {
  6. return $money * $discount;
  7. }
  8. echo '实付金额: ' . getPrice(5000, 0.8);
  9. echo '<hr>';
  10. //2.系统函数
  11. $a =[100,200,300];
  12. //求数组的和
  13. echo array_sum($a);
  14. echo '<hr>';
  15. //3.可变函数
  16. function getName(string $name) : string
  17. {
  18. return $name;
  19. }
  20. $funcName = 'getName';
  21. echo '姓名: ' . $funcName("king");
  22. echo '<hr>';
  23. // 4. 匿名函数: 闭包, 可以访问父作用域的变量
  24. $discount = 0.6;
  25. // $discount 的作用域是全局
  26. $getAmount = function (float $money, int $num) use ($discount) : float
  27. {
  28. $amount = $money * $num;
  29. return $amount >= 2000 ? $amount * $discount : $amount;
  30. };
  31. echo '实付金额: ' . $getAmount(100, 20);
  32. echo '<hr>';
  33. // 如果父作用域又是一个函数
  34. $f = function ($discount) {
  35. // 子函数
  36. return function (float $money, int $num) use ($discount) : float
  37. {
  38. $amount = $money * $num;
  39. return $amount >= 2000 ? $amount * $discount : $amount;
  40. };
  41. };
  42. echo '金额: ' .$f(0.6)(200, 20);

函数如果如果需要使用全局变量,可在function()后面使用use(全局变量)调用


3. 返回值

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

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

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

4. 参数

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

参数类型

序号 类型 描述
1 值参数 默认传参方式
2 引用参数 改变原始调用参数值
3 默认参数 调用时允许省略的参数
4 剩余参数 调用参数数量不确定
  1. // 1. 值参数, 默认
  2. function demo1(float $a,float $b) : float
  3. {
  4. return "$a + $b=".$a+$b;
  5. }
  6. $a=5;$b=10;
  7. echo demo1($a,$b) , '<br>';
  8. // 在函数中改变了调用参数的值,但原始调用参数并没有发生变化
  9. echo $a+$b;
  10. echo '<hr>';
  11. // 2. 引用传递
  12. function demo2(float &$a,float $b) : float
  13. {
  14. return $a +=$b;
  15. }
  16. $a = 100;
  17. $b = 20;
  18. echo demo2($a,$b) , '<br>';//值200
  19. // 如果在参数前面使用了取地址符,则会改变原始调用参数的值
  20. echo $a; //值200
  21. echo '<hr>';
  22. // 3. 默认参数
  23. // 默认参数必须写在必选参数的后面
  24. //将$c设置为默认参数初始值为100
  25. function demo3($a,$b,$c=100)
  26. {
  27. return $a+$b+$c;
  28. }
  29. //当demo3的第三个参数未设置时$c的值为100,所以结果为103
  30. echo demo3(1,2).'<br>';
  31. //也可设置默认参数的值,此时$c的值为10,所以结果为13
  32. echo demo3(1,2,10).'<hr>';
  33. // 4. 剩余参数
  34. function demo4(float $a, float $b, float $c ) : float
  35. {
  36. return $a + $b + $c;
  37. }
  38. // 计算三个数之和
  39. echo demo4(1,2,3), '<br>';
  40. echo '<hr>';
  41. //第一种方法
  42. function demo5( )
  43. {
  44. // 参数数量
  45. // return func_num_args();
  46. // 根据索引返回指定的调用参数
  47. // return func_get_arg(2);
  48. $total = 0;
  49. // for ($i = 0;$i <func_num_args(); $i++ ) {
  50. // $total +=func_get_arg($i);
  51. // }
  52. // return $total;
  53. foreach (func_get_args() as $value) {
  54. $total +=$value;
  55. }
  56. return $total;
  57. }
  58. // echo demo5(3,4,7,8,24);
  59. print_r(demo5(3,4,7,8,24));
  60. echo '<hr>';
  61. //第二种方法
  62. $arr=[1,2,3,4,5,6,7,8,9,100];
  63. //'...'将传入的参数打包成数组
  64. function demo5(...$arr)
  65. {
  66. return array_sum($arr);
  67. }
  68. // ...:
  69. // 1. 用在函数的形式参数列表中,表示"收集",将多个离散的参数打包到一个数组中处理
  70. // 2. 用在函数的调用参数列表中,表示"展开",还原将一个数组展开成一个个离散的值
  71. print_r(demo5(...$arr));
  72. echo '<hr>';
  73. // 扩展知识
  74. $user[] = [100, 'admin', 90];
  75. $user[] = [110, 'peter', 60];
  76. $user[] = [120, 'jack', 98];
  77. // 数组解包
  78. // js中解构赋值, php中也有解构
  79. foreach ($user as list($id, $name)) {
  80. printf('id=%s, name=%s<br>', $id, $name);
  81. }

5. 回调函数

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

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

php中提供了两个内置的回调函数
call_user_func() call_user_func_array()

这两个函数的区别是:

call_user_func_array(回调函数,参数数组)是以数组的形式接受回调函数和参数的。

call_user_func(回调参数, 参数1, 参数2)参数的个数是根据回调函数来决定的。

  1. //普通函数
  2. function f1($param1,$param2)
  3. {
  4. echo '函数'.__FUNCTION__.'被执行,传入的参数是:'.$param1.' '.$param2;
  5. echo "<br/>";
  6. }
  7. //通过call_user_func调用函数f1
  8. call_user_func('f1','姓名','king');
  9. //通过call_user_func_array调用函数
  10. call_user_func_array('f1',array('姓名','wen'));
  11. //结果
  12. 函数f1被执行,传入的参数是:姓名 king
  13. 函数f1被执行,传入的参数是:姓名 wen
  1. class A{
  2. public $name;
  3. function show($param)
  4. {
  5. echo '传入参数是:'.$param."<br/>";
  6. echo 'my name is:'.$this->name;
  7. echo "<br/>";
  8. }
  9. function show1($param1,$param2)
  10. {
  11. echo __METHOD__.'方法被执行,传入参数是:'.$param1.' '.$param2."<br/>";
  12. }
  13. public static function show2($param1,$param2)
  14. {
  15. echo __METHOD__.'方法被执行,传入参数是:'.$param1.' '.$param2."<br/>";
  16. }
  17. }
  18. //调用类中非静态成员函数,该成员函数中有$this调用了对象中的成员
  19. $a = new A;
  20. $a->name = 'wen';
  21. call_user_func_array(array($a,'show',),array('han!'));
  22. //调用类中非静态成员函数,没有对象被创建,该成员函数中不能有$this
  23. call_user_func_array(array('A','show1',),array('han!','wen'));
  24. //调用类中静态成员函数
  25. call_user_func_array(array('A','show2'),array('param1','param2'));
  26. //运行结果
  27. 传入参数是:han!
  28. my name is:wen
  29. A::show1方法被执行,传入参数是:han! wen
  30. A::show2方法被执行,传入参数是:param1 param2

6. 命名空间

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

PHP如何定义命名空间

默认情况下,所有常量、类和函数名都放在全局空间下,就和PHP支持命名空间之前一样。

命名空间通过关键字namespace 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间。语法格式如下;

  1. <?php
  2. // 定义代码在 'MyProject' 命名空间中
  3. namespace MyProject;
  4. // ... 代码 ...

也可以在同一个文件中定义不同的命名空间代码,如:

  1. <?php
  2. namespace MyProject1;
  3. // MyProject1 命名空间中的PHP代码
  4. namespace MyProject2;
  5. // MyProject2 命名空间中的PHP代码
  6. // 另一种语法
  7. namespace MyProject3 {
  8. // MyProject3 命名空间中的PHP代码
  9. }
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议