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

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

leverWang
leverWang原创
2020年07月10日 14:45:191086浏览

1.函数的声明与调用

  1. //函数是代码复用的重要手段, 函数是通过调用来执行的,函数命名要有意义,函数名以数字或下划线开头(不能以数字开头):
  2. function 函数名称的标识符(参数列表) {
  3. 函数体,由一条或多条语句组成,也可以为空
  4. }
  5. //示例:
  6. //声明函数demo
  7. function demo($arg){
  8. echo "{$arg}";
  9. }
  10. //调用函数
  11. demo($arg='hello world'); //输出hello world

2.函数的类型

  • 自定义函数
  • 系统函数
  • 可变函数
  • 匿名函数

示例:

  1. //1.自定义函数
  2. //在PHP7,一个新的功能,返回类型声明已被引入。返回类型声明指定一个函数返回值的类型
  3. function getnum($arg, $arg1): float
  4. {
  5. return $arg + $arg1;
  6. }
  7. echo '输出:' . getnum(11.1, 12) . '<hr>';
  8. // 2. 系统函数,php内置的函数,可以直接使用
  9. $pwd = '12345678';
  10. //内置的加密算法函数
  11. echo hash('md5', $pwd) . '<br>';
  12. echo sha1($pwd) . '<hr>';
  13. //3. 可变函数,是把函数名变为另一个变量的值
  14. function add($arg, $arg1): float
  15. {
  16. return $arg + $arg1;
  17. }
  18. $func = 'add';
  19. echo $func(2, 4) . '<hr>';
  20. //4. 匿名函数,也叫闭包函数,允许临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值
  21. $demo = function ($str) {
  22. printf("Hello %s <br>", $str);
  23. };
  24. $demo('World');
  25. //闭包可以从父作用域中继承变量。任何此类变量都应该用 use 语言结构传递进去
  26. //当父作用域是全局时
  27. $num = 2;
  28. $p = function ($arg) use ($num): float {
  29. return $arg * $num;
  30. };
  31. echo '输出结果:' . $p(3.5) . '<br>';
  32. //父作用域是父函数
  33. $data = [
  34. ['name' => 'jack', 'score' => 99],
  35. ['name' => 'Anastasia', 'score' => 40],
  36. ['name' => 'Abraham', 'score' => 80],
  37. ['name' => 'Alexander', 'score' => 59],
  38. ];
  39. $f = function ($data) {
  40. //在匿名函数后面加上"use(父作用域中的变量)"
  41. $p = function ($line) use ($data) : array {
  42. foreach ($data as $item) {
  43. $str[] = [
  44. 'name'=> $item['name'],'result'=>($item['score'] > $line) ? '合格' : '不合格'
  45. ];
  46. }
  47. return $str;
  48. };
  49. return $p;
  50. };
  51. $s = $f($data)(60);
  52. foreach ($s as $item){
  53. echo $item['name'].':'.$item['result'].'<br>';
  54. }


3.函数的返回值

示例:

  1. <?php
  2. // 函数是必须有返回值的,默认返回值为null 示例如下:
  3. function demo(){}
  4. var_dump(demo());
  5. echo '<hr>';
  6. // 函数只能返回单一的值,返回多值有以下几种方式
  7. // 1.通过字符串拼接
  8. function demo1():string
  9. {
  10. $str1 = 'hello';
  11. $str2 = 'php';
  12. return $str1 . $str2;
  13. }
  14. echo demo1().'<hr>';
  15. // 2.通过数组的方式
  16. function demo2():array
  17. {
  18. $name = '张三';
  19. $age = 22;
  20. return ['name' => $name,'age' =>$age ];
  21. }
  22. var_dump(demo2()['name']);
  23. echo '<br>',(demo2()['age']),'<hr>';
  24. // 3.通过json对象字面量字符串的方式
  25. function demo3():string
  26. {
  27. $str1 = 'hello';
  28. $str2 = 'world';
  29. return json_encode(['str1' => $str1,'str2' => $str2]);
  30. }
  31. //输出json格式数据
  32. echo demo3(),'<br>';
  33. // 将json数据解码
  34. print_r(json_decode(demo3()));
  35. echo '<hr>';
  36. // 4.序列化的方式
  37. function demo4():string
  38. {
  39. $name = '张三';
  40. $age = 22;
  41. return serialize(['name' => $name,'age' =>$age ]);
  42. }
  43. //序列化后的数据
  44. echo demo4(),'<br>';
  45. // 反序列化: 还原
  46. print_r(unserialize(demo4()));

4.函数中的参数

  1. //1.值参数
  2. $num = 999;
  3. function demo($num): float
  4. {
  5. return $num;
  6. }
  7. //2.引用传参
  8. $num1 = 666;
  9. //在参数前添加取地址符&
  10. function demo1(&$num1): float
  11. {
  12. // 函数内部对参数的更新会实时映射到外部实际参数
  13. return $num1 *= 2;
  14. }
  15. echo $num1, '<br>';//666
  16. echo demo1($num1), '<hr>';//1332
  17. // 3. 默认参数
  18. // 没有传参时默认的参数的值
  19. // 有默认值的参数,必须写到没有默认值参数的后面
  20. function demo2($num3, $num4, $n = 3)
  21. {
  22. return $num3 * $num4 * $n;
  23. }
  24. // 没有传参数$n, 此时会使用$n的默认值3
  25. echo demo2(1, 10) . "<br>";//输出:30
  26. echo demo2(1, 10, 0.5) . "<hr>";//输出:5
  27. //4.剩余参数
  28. //参数不固定的情况下使用 ...参数名来表示,将所有参数整合到数组中.
  29. //剩余参数用在函数的参数列表中:收集
  30. //剩余参数用在函数的调用表达式中,是展开
  31. function demo3(...$args)
  32. {
  33. //求传入参数的和
  34. return array_sum($args);
  35. }
  36. echo demo3(1, 2, 3) . "<br>";//输出6
  37. // 调用参数的数量不固定的情况
  38. $arr = [1, 2, 3];
  39. $res = demo3(...$arr);
  40. print_r($res);
  41. //5.回调函数
  42. //定义一个数组
  43. $data = range(1,100);
  44. //将数组中的每个值传到匿名函数中处理后返回处理以后的新数组
  45. $arr = array_map(function ($item) {
  46. if ($item % 2 === 0) return $item;
  47. }, $data);
  48. // 过滤掉空值
  49. $res=array_filter($arr);
  50. // 数组重排 array_values()
  51. var_dump(array_values($res));

5.函数的命名空间

  1. namespace s1{
  2. function demo1(){
  3. return "这是space1";
  4. }
  5. }
  6. namespace s2{
  7. function demo1(){
  8. return "这是space2";
  9. }
  10. }
  11. namespace {
  12. echo s1\demo1();
  13. }

总结:初步掌握了函数的基本用法和参数传递,对回调函数的运行机制还是很模糊;

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