Blogger Information
Blog 60
fans 5
comment 3
visits 65250
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP函数的声明与调用及其类型、返回值、参数和命名空间
longlong
Original
903 people have browsed it

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字符串和序列化

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

  • 函数命名空间与访问

Correcting teacher:GuanhuiGuanhui

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