Blogger Information
Blog 12
fans 0
comment 0
visits 10103
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
php 函数定义、类型、参数、返回值
星夜低语
Original
1472 people have browsed it

函数

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. }
Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:最后部分还没学, 不用写的
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post