博客列表 >PHP函数的声明与调用及其类型、返回值、参数和命名空间

PHP函数的声明与调用及其类型、返回值、参数和命名空间

longlong
longlong原创
2020年07月08日 17:02:45902浏览

1. 函数的声明与调用

  1. <?php
  2. // 函数是代码复用的重要手段
  3. // 复习:变量是数据复用的重要手段
  4. // 函数是通过调用函数来执行的,其规范要求:
  5. // 1. 函数的名称要提示出它的功能
  6. // 2. 函数名称以数字或下划线开头(不能以数字开头)
  7. // 声明一个函数如下:
  8. function name(){
  9. // 执行代码
  10. }
  11. // 调用一个函数如下:
  12. name();
  13. // 示例:对两个整数求积
  14. function multiplication( int $x, int $y):int
  15. {
  16. return $x*$y;
  17. }
  18. echo multiplication(5,5);

2. 函数的类型

按照其功能和结构可将函数划分以下几类:

  • 自定义函数

  • 系统函数

  • 可变函数

  • 匿名函数

示例如下:

  1. <?php
  2. // 1. 自定义函数:由用户自定义函数,用户自己取函数名
  3. function show(string $str):string
  4. {
  5. return $str;
  6. }
  7. echo show('hello world'),'<hr>';
  8. // 2. 系统函数:php内置的函数,拿来就用
  9. $num = rand(1,10); // 产生一个1-10的随机整数
  10. echo $num,'<br>';
  11. echo rand(50,60),'<hr>';
  12. // 3. 可变函数,与可变变量一样,它是把函数名变为另一个变量的值
  13. function password(int $num):int
  14. {
  15. return $num;
  16. }
  17. $var = 'password';
  18. // 用函数名调用函数
  19. echo password(123456),'<br>';
  20. // 用变量调用
  21. echo $var(666666),'<hr>';
  22. // 4. 匿名函数:没有定义名字的函数,比如把整个函数赋值给一个变量
  23. $avg = function(float $score1, float $score2):float
  24. {
  25. return ($score1 + $score2)/2;
  26. };
  27. echo '平均分是:'.$avg(80,65),'<hr>';
  28. // 注:匿名函数可以访问父作用域中的变量,在php中也称为闭包
  29. // 示例一:当父作用域是全局时
  30. $standard = 85; // 这是一个全局变量
  31. $compare = function(float $score1, float $score2, float $score3) use($standard):string
  32. {
  33. $avg = ($score1 + $score2 + $score3)/3;
  34. return $avg >= $standard ? '成绩合格' : '成绩不合格';
  35. };
  36. echo $compare(88,88,90),'<hr>';
  37. // 示例二:当父作用域是父函数时
  38. //父函数定义一个标准成绩分数
  39. $st = function($stand){
  40. // 子函数定义一个用平均分和标准分比较的函数
  41. $compare = function(float $score1, float $score2, float $score3) use($stand):string
  42. {
  43. $avg = ($score1 + $score2 + $score3)/3;
  44. return $avg >= $stand ? '成绩合格' : '成绩不合格';
  45. };
  46. return $compare; // 这一步一定要有,把函数以返回值的形式返回给调用者
  47. };
  48. echo $st(90)(80,60,56);
  49. // 注:使用匿名函数访问父作用域中的变量时,一定要在匿名函数后面加上"use(父作用域中的变量)"

3. 函数的返回值

示例如下:

  1. <?php
  2. // 函数是必须有返回值的,示例如下:
  3. function name(){}
  4. var_dump(name()); // NULL,说明函数是有返回值的,只不过没有定义内容,为空
  5. echo '<hr>';
  6. // 函数是只能返回单一值的,如果要实现多值返回,有以下几种方法
  7. // 方法一:通过字符串拼接的方式
  8. function change1():string
  9. {
  10. $str1 = 'hello';
  11. $str2 = 'world';
  12. return $str1.'&nbsp;&nbsp;&nbsp;&nbsp;'.'<span style="color:red;">'.$str2.'</span>';
  13. }
  14. echo change1(),'<hr>';
  15. // 方法二:通过数组的方式
  16. function change2():array
  17. {
  18. $str1 = 'hello';
  19. $str2 = 'world';
  20. return ['str1' => $str1,'str2' => $str2];
  21. }
  22. print_r(change2());
  23. echo '<br>',(change2()['str2']),'<hr>';
  24. // 方式三:通过json对象字面量字符串的方式
  25. function change3():string
  26. {
  27. $str1 = 'hello';
  28. $str2 = 'world';
  29. return json_encode(['str1' => $str1,'str2' => $str2]);
  30. }
  31. echo change3(),'<br>';
  32. // 还原后变为json对象
  33. print_r(json_decode(change3()));
  34. echo '<hr>';
  35. // 方式四:序列化方式
  36. function change4():string
  37. {
  38. $str1 = 'hello';
  39. $str2 = 'world';
  40. return serialize(['str1' => $str1,'str2' => $str2]);
  41. }
  42. echo change4(),'<br>';
  43. // 反序列化后还原为数组
  44. print_r(unserialize(change4()));

4. 函数的参数

示例如下:

  1. <?php
  2. // 函数中的参数有几下几种
  3. // 1. 值参数,默认方式,不会改变变量的值
  4. // 示例:求长方形的周长
  5. function girth(float $width, float $hight):float
  6. {
  7. return ($width + $hight)*2;
  8. }
  9. $width = 1.5;
  10. $hight = 2.8;
  11. echo girth($width,$hight),'<br>';
  12. echo $width,'<br>',$hight,'<hr>';
  13. // 2.引用参数,在参数前面加上取地址符&
  14. function square(float &$s):float
  15. {
  16. return $s /= 2; //加上取地址符后的参数,它的值变化也会使函数外部的值产生变化
  17. }
  18. $square = 40;
  19. echo square($square),'<br>';
  20. echo $square,'<hr>'; //这里的输出结果变为了20
  21. // 3. 默认参数:就是在传参数的时候给定参数一个默认取值
  22. function user(string $username = 'root'):string
  23. {
  24. return $username;
  25. }
  26. // 调用时不传参数会输出默认参数值
  27. echo user(),'<br>';
  28. // 调用时传入参数则会取代默认参数值
  29. echo user('alice'),'<hr>';
  30. // 注:在传入多个参数时,必须将有参数值的放在最后面,如下:
  31. // function user(string $usename1, string $username2, string $username3 = 'root'):string {}
  32. // 4. 剩余参数:就是当传入函数的参数数量和调用时的参数数量不一致时
  33. $get = function ($count)
  34. {
  35. $avg = function (int $num1, int $num2, int $num3) use($count) :float
  36. {
  37. return ($num1 + $num2 + $num3) / $count;
  38. };
  39. return $avg;
  40. };
  41. echo $get(3)(10,16,18),'<br>';
  42. // 以上是一个求平均数的例子,调用时传入3个参数,但是当我们要传入更多的参数时呢,如下:
  43. echo $get(6)(10,10,10,20,60,30);
  44. echo '<br>';
  45. // 这时后面的参数并没有输出,只运算了(10+10+10)/6=5,所以,当传入参数不确定时,可以采用下面这种方法:
  46. $get1 = function (int $count)
  47. {
  48. $avg1 = function (...$args) use($count) :float
  49. {
  50. return array_sum($args) / $count;
  51. };
  52. return $avg1;
  53. };
  54. echo $get1(6)(10,10,10,20,60,30),'<br>';
  55. // 因为是以数组的方式,所以可以用count()函数来计算数组的长度,来达到自动计算输入参数的个数,
  56. // 上面案例可简化如下:
  57. function avg (...$args) :float
  58. {
  59. return array_sum($args) / count($args);
  60. };
  61. echo avg(10,10,10,20,60,30);

5. 异步编程中函数的参数

示例如下:

  1. <?php
  2. // 异步编程中的函数参数
  3. // 异步编程:当函数的执行的时间和顺序无法预测时,通过事件或者回调来执行函数
  4. // 它的执行由父函数决定何时调用
  5. // 示例:将数组中的每个数值增大1倍
  6. $arr1 = [2,3,4,5,6];
  7. // 创建一个新的数组来接收新的数值
  8. // 使用array_map()返回一个新的数组,此例将一个匿名函数作为一个参数传到array_map()函数中使用
  9. // 当父函数执行的时候,才会执行内部的回调函数
  10. $arr2 = array_map(function($num){
  11. return $num*$num;
  12. },$arr1);
  13. echo '<pre>'.print_r($arr2,true).'</pre>';

6. 函数的命名空间

函数的命名空间用法和变量的命名空间是相似的,示例如下:

  1. <?php
  2. // 函数的命名空间
  3. // 1. 命名空间
  4. namespace ns1{
  5. function sum(int $a, int $b):int
  6. {
  7. return $a + $b;
  8. }
  9. }
  10. // 2. 全局空间中访问
  11. namespace{
  12. echo ns1\sum(10,5);
  13. }

6. 总结

  • 知道函数如何声明与调用,它是代码复用的重要手段

  • 函数分为四大类型:自定义函数,系统函数,可变函数,匿名函数,掌握好每种类型的应用场景

  • 函数的返回值虽然是单一值,但是可以通过其他途径实现多值返回,如:字符串拼接,数组,json字符串和序列化

  • 函数的参数如何使用,传参有哪些方式:值参数、引用参数、默认参数、剩余参数

  • 函数命名空间与访问

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