Blogger Information
Blog 5
fans 0
comment 1
visits 4241
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
php 函数知识点概论
鸿运当头郭小胖
Original
994 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 (){...} 也叫”闭包”或”函数表达式”,常用做回调处理

3. 返回值

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

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


4. 参数

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

参数类型

序号 类型 描述
1 值参数 默认传参方式
2 引用参数 改变原始调用参数值
3 默认参数 调用时允许省略的参数
4 剩余参数 调用参数数量不确定

5. 回调函数

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

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


6. 命名空间

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

代码小示例

可变函数、系统函数和匿名函数

  1. <html>
  2. <head>
  3. <meta charset="utf-8">
  4. <title>金额换算</title>
  5. </head>
  6. <body>
  7. <?php
  8. // 定义变量
  9. $discount = $_POST['discount'];
  10. $money = $_POST['money'];
  11. $num = $_POST['num'];
  12. $f = function ($discount) {
  13. // 子函数
  14. return function (float $money, float $num) use ($discount) : float
  15. {
  16. $amount = $money * $num;
  17. return $amount = $amount >= 2000 ? $amount * $discount : $amount;
  18. };
  19. };
  20. ?>
  21. <form method="post">
  22. 单价: <input type="text" name="money">
  23. 数量: <input type="text" name="num">
  24. 折扣:<input type="text" name="discount">
  25. <input type="submit" value="提交">
  26. </form>
  27. <?php
  28. echo "<h2>您应付金额是:</h2>";
  29. echo $f($discount)($money,$num);
  30. ?>
  31. </body>
  32. </html>

匿名函数

通过JSON返回

  1. <?php
  2. function w_connct1() : string
  3. {
  4. // json_encode(): 将php数据编码为json格式的字符串返回
  5. return json_encode(['status'=>1, 'message'=>'成功']);
  6. }
  7. $data = w_connct1();
  8. echo $data;
  9. echo '<hr>';
  10. // 将json格式的字符串还原/解析为php对象/数组
  11. $var = json_decode($data, true);
  12. print_r($var);
  13. echo '<hr>';

JSON

通过序列化返回

  1. <?php
  2. //序列化返回
  3. function w_connct1() : string
  4. {
  5. return serialize(['status'=>1, 'message'=>'成功']);
  6. }
  7. echo w_connct1();
  8. // 反序列化才可以使用
  9. $arr =unserialize(w_connct1());
  10. printf('<pre>%s</pre>', print_r($arr,true));

序列化

值参数、引用传递

  1. <?php
  2. function demo1(float $arg) : float
  3. {
  4. return $arg *= 2;
  5. }
  6. $value = 800;
  7. echo demo1($value) , '<br>';
  8. // 在函数中改变了调用参数的值,但原始调用参数并没有发生变化
  9. echo $value;
  10. echo '<hr>';
  11. // 2. 引用传递
  12. function demo2(float &$arg) : float
  13. {
  14. return $arg *= 2;
  15. }
  16. $value = 800;
  17. echo demo2($value) , '<br>';
  18. // 如果在参数前面使用了取地址符,则会改变原始调用参数的值
  19. echo $value;
  20. echo '<hr>';
  21. // 3. 默认参数
  22. // 默认参数必须写在必选参数的后面
  23. function demo3(float $a, float $b, string $opt = '+' )
  24. {
  25. $res = 0;
  26. switch ($opt) {
  27. case '+':
  28. $res = "$a + $b = " . ($a + $b);
  29. break;
  30. case '-':
  31. $res = "$a - $b = " . ($a - $b);
  32. break;
  33. case '*':
  34. $res = "$a * $b = " . ($a * $b);
  35. break;
  36. case '/':
  37. $res = "$a / $b = " . ($a / $b);
  38. break;
  39. default:
  40. $res = '非法操作符';
  41. }
  42. return $res;
  43. }
  44. echo demo3(10, 20), '<br>';
  45. // echo demo3(10, 20, '*'), '<br>';
  46. // echo demo3(10, 20, '#'), '<br>';
  47. echo '<hr>';
  48. // 4. 剩余参数
  49. function demo4(float $a, float $b, float $c ) : float
  50. {
  51. return $a + $b + $c;
  52. }
  53. // 计算三个数之和
  54. echo demo4(1,2,3), '<br>';
  55. echo '<hr>';
  56. function demo5( )
  57. {
  58. // 参数数量
  59. // return func_num_args();
  60. // 根据索引返回指定的调用参数
  61. // return func_get_arg(2);
  62. // return func_get_args();
  63. $total = 0;
  64. // for ($i = 0;$i <func_num_args(); $i++ ) {
  65. // $total +=func_get_arg($i);
  66. // }
  67. // return $total;
  68. foreach (func_get_args() as $value) {
  69. $total +=$value;
  70. }
  71. return $total;
  72. }
  73. // echo demo5(3,4,7,8,24);
  74. print_r(demo5(3,4,7,8,24));
  75. echo '<hr>';
  76. // echo demo5(1,2,3,4,5,6,9,22,67), '<br>';
  77. // 使用剩余参数简化
  78. // ...: 参数归纳:
  79. function demo6(...$args ) : float
  80. {
  81. // return $args;
  82. return array_sum($args);
  83. // return array_product($args);
  84. }
  85. // print_r(demo6(3,4,7,8,24));
  86. // echo demo6(1,2,3,4,5,6,9,22,67), '<br>';
  87. // 调用参数
  88. $arr = [1,2,3,4,5,6,9,22,67];
  89. // ...:
  90. // 1. 用在函数的形式参数列表中,表示"收集",将多个离散的参数打包到一个数组中处理
  91. // 2. 用在函数的调用参数列表中,表示"展开",还原将一个数组展开成一个个离散的值
  92. print_r(demo6(...$arr));
  93. echo '<hr>';
  94. // $config = ['localhost', 'phpedu', 'uft8', '3306'];
  95. // $dsn = 'mysql:host=localhost;dbname=phpedu;charset=utf8;port=3306';
  96. // $db = [$dsn, $username, $password];
  97. // $pdo = new PDO(...$db);
  98. // 扩展知识
  99. $user[] = [100, '小红', 90];
  100. $user[] = [110, '小兰', 60];
  101. $user[] = [120, '小芬', 98];
  102. // 数组解包
  103. // js中解构赋值, php中也有解构
  104. foreach ($user as list($id, $name)) {
  105. printf('id=%s, name=%s<br>', $id, $name);
  106. }
个人问题

foreach的概念还是有点理解不透彻。还需要多加练习!

回调函数

  1. <?php
  2. # 回调函数:用在函数的回调参数中
  3. //回调:在将来某一时刻,或者某个事件发生时再执行
  4. //生成一个1-100共100个整数的数组
  5. // $data=[1,2,3,4,5,6,7,8,9,...,100];
  6. // $data = range(0, 99, 5);
  7. // // range(起始数字,结束数字,步长)
  8. // print_r($data);
  9. // 只返回当前数据中偶数
  10. $data = range(0, 99);
  11. print_r($data);
  12. //只返回偶数
  13. var_dump(4 % 2);
  14. echo ((4 % 2) == 0) ? '偶数' : '奇数';
  15. $res = array_map(function (int $item) {
  16. if ($item % 2 === 0) return $item;
  17. }, $data);
  18. // array_map(回调函数,数组)
  19. echo $res;
  20. printf('<pre?>%s</pre>', print_r($res, true));
  21. // 过滤空值/假值
  22. // array_filter仅返回结果为trus的数据
  23. $res = array_filter($res, function ($item) {
  24. return $item;
  25. });
  26. $res = array_values($res);
  27. printf('<pre>%s</pre>', print_r($res, true));

回调函数

命名空间

  1. <?php
  2. # 命名空间(相当于在不同的目录下)
  3. // 防止命名冲突
  4. // 全局成员:函数,常量,类,接口
  5. namespace ns1 {
  6. function demo1(): string
  7. {
  8. return __FUNCTION__;
  9. }
  10. }
  11. namespace ns2 {
  12. function demo1(): string
  13. {
  14. return __FUNCTION__;
  15. }
  16. }
  17. // 全局空间不需要名称
  18. namespace {
  19. echo \ns1\demo1();
  20. echo '<hr>';
  21. echo \ns2\demo1();
  22. }

总结

通过学习函数的概念以及函数基础知识点,算是已经对php的一个基本构成有了一个初步的了解了。但是,说实话,关于一些函数的作用以及方式,还是记不住。这个只能通过日后多加练习来进行记忆了!foreach的概念还是有点理解不透彻。每次写都得参考教案来进行书写,根本记不住!!脑子瓦特了!!!

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:foreach今晚还会细说
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