博客列表 >函数知识总结

函数知识总结

我是郭富城
我是郭富城原创
2020年04月22日 05:42:39719浏览

函数知识总结

1. 语法

  • 功能:函数是实现代码复用的重要方式,在所有编程语言中均如此
  1. //函数声明
  2. function 函数名称(类型: 参数列表): 返回值类型
  3. {
  4. // 函数体
  5. return 返回值;
  6. //隐式:结束大括号的时候自动返回
  7. //return不是必须的
  8. }
  9. //函数调用,按照函数名称调用(调用需要echo)
序号 名称 描述
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 (){...} 也叫”闭包”或”函数表达式”,常用做回调处理

2.1 自定义函数(命名函数)

  • 1.getPrice: 小驼峰命名法
  • 2.get_price: 蛇形命名法
  1. <?php
  2. function myPrice(int $num, int $price): int
  3. {
  4. $myPrice = $num * $price;
  5. return $myPrice;
  6. }
  7. echo myPrice(20, 30);

2.2 系统函数

  • 系统开启 php 自带的
  1. <?php
  2. $str = '我爱php中文网';
  3. echo mb_substr($str, 0, 3);
  4. //系统函数,自带的,不需自定义

2.3 可变函数

  • 函数名储存在变量中
  • 通过变量名调用函数
  1. <?php
  2. function myPrice(int $num, int $price): int
  3. {
  4. $myPrice = $num * $price;
  5. return $myPrice;
  6. }
  7. echo myPrice(20, 30);
  8. echo '<hr>';
  9. //可变函数
  10. // 函数名储存在变量中
  11. $funcName = 'myPrice';
  12. echo $funcName(20, 30);
  13. //通过变量调用函数

2.4 匿名函数

  • 闭包可以访问父作用域(use)
  1. <?php
  2. // 4.匿名函数:闭包
  3. $discount = 0.6;
  4. $num = 100; //全局变量
  5. //闭包就是匿名函数,被赋值给一个变量了,闭包可以访问父作用域
  6. $getPrice = function (float $num, float $price) use ($discount): float {
  7. // global $discount;
  8. $myprice = $num + $price;
  9. return $myprice > 100 ? $myprice * $discount : $myprice;
  10. };
  11. echo $getPrice(100, 20);
  • 函数中又有一个函数(相互嵌套)
  1. <?php
  2. // 如果父作用域又是一个函数
  3. $discount = 0.6;
  4. $a = function ($discount) {
  5. //子函数
  6. $getPrice = function (float $num, float $price) use ($discount): float {
  7. $myprice = $num + $price;
  8. return $myprice > 100 ? $myprice * $discount : $myprice;
  9. };
  10. return $getPrice;
  11. };
  12. echo $a(0.6)(200, 20);
  13. // echo gettype($a);

3. 返回值

  • 函数必须要有返回值
  • 函数必须是遵守单值返回原则
  • 返回多值需要处理:1.字符串拼装,2.数组,3.jason 字符串,4.序列化:字符串
    | 序号 | 场景 | 描述 |
    | —— | ————— | ————————————————- |
    | 1 | return | 可以返回任何类型的值,包括函数类型 |
    | 2 | 无return | 遇到}也会返回, 默认返回null |

  • 如果需要返回多个值,可以通过以下手段

序号 返回值类型 描述
1 string 字符串拼接
2 array 数组
3 json JSON 字符串
4 serialize 序列化字符串

json 和序列化,使用时需要进行解码操作
java 等多个地方使用

3.1 字符串拼接

  • 适合处理大量 php+html 代码混合
  • 返回格式为用户自定义,前端处理非常麻烦
  1. <?php
  2. function demo1(): string
  3. {
  4. $status = '1';
  5. $message = '登陆成功';
  6. return $status . '状态为:' . $message;
  7. }
  8. echo demo1();
  9. //适合处理大量php+html代码混合
  10. //返回格式为用户自定义,前端处理非常麻烦

3.2 通过数组的方式

  • 是一种使用 js 字面量的方式来表示数据,是一种轻量级别的通用的数据交换或者传输格式;
  • jason 本质上就是一个具有一定结构和格式的字符串,几乎所有编程语言都有他的接口;
  1. <?php
  2. // 返回值通过数组
  3. //函数是全局的
  4. function demo2(): array
  5. {
  6. // $status = '1';
  7. // $message = '登陆成功';
  8. return ['status' => 1, 'message' => '成功'];
  9. }
  10. // echo print_r(demo2(), true);
  11. // echo '<pre>' . print_r(demo2(), true) . '</pre>';
  12. printf('<pre> %s </pre>', print_r(demo2(), true));
  13. // echo demo2()['status'] == 1 ? demo2()['message'] : '验证失败';
  14. echo demo2()['status'] == 1 ? '<span style="color:red">' . demo2()['message'] . '</span> ' : '验证失败';

3.3 通过 json 的方式

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

3.4 序列化:字符串

  • 其实 json 也是一种序列化
  • 如何序列化?
  1. <?php
  2. //4.通过序列化返回多个值
  3. function demo4(): string
  4. {
  5. return serialize(['status' => 1, 'message' => '登陆成功']);
  6. //a:2:{s:6:"status";i:1;s:7:"message";s:12:"登陆成功";}
  7. //a数组
  8. //2两个元素
  9. //s字符串
  10. //6个字符
  11. //i值为证书
  12. //1是他的值
  13. //s字符串
  14. //7个字符
  15. //utf8一个汉字3个字节
  16. }
  17. echo demo4();
  • 如何反序列化
  1. //反序列化
  2. unserialize(demo4());
  3. $arr = unserialize(demo4());
  4. printf('<pre>%s<pre>', print_r($arr, true));

4. 参数

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

参数类型

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

4.1 值传递,值参数

-在函数中改变了调用参数的值,但是原始调用参数并没有发生变化

  1. //1.值参数,值传递
  2. function demo1(float $arg): float
  3. {
  4. return $arg * 2;
  5. }
  6. $value = 1000;
  7. echo demo1($value), '<br>';
  8. //在函数中改变了调用参数的值,但是原始调用参数并没有发生变化
  9. echo $value;

4.2 引用参数,引用传递

  • &取地址符
  1. //2.引用参数,引用传递
  2. function demo1(float &$arg): float
  3. {
  4. return $arg *= 2;
  5. }
  6. $value = 1000;
  7. echo demo1($value), '<br>';
  8. //如果在参数前面使用了取地址符,则会改变原始调用参数的值
  9. echo $value;
  10. echo '<hr>';

4.3 默认参数

  • 默认参数不能出现在必选参数前面
  1. <?php
  2. function demo1(float $a, float $b, string $opt = '+')
  3. //默认参数不能出现在必选参数前面
  4. {
  5. $res = 0;
  6. switch ($opt) {
  7. case '+':
  8. $res = "$a+$b=" . ($a + $b);
  9. break;
  10. case '-':
  11. $res = "$a-$b=" . ($a - $b);
  12. break;
  13. case '*':
  14. $res = "$a*$b=" . ($a * $b);
  15. break;
  16. case '/':
  17. $res = "$a/$b=" . ($a / $b);
  18. break;
  19. default:
  20. $res = '非法操作符号';
  21. }
  22. return $res;
  23. }
  24. echo demo1(10, 20);
  25. echo demo1(10, 20, '*');

4.4 剩余参数(重点)

  • return func_num_args();返回参数的数量
  • return func_get_arg();根据索引返回指定的调用参数
  • return func_get_args();返回一个数据,分别是索引对应的值

4.4.1 第一种方式,for 循环

  1. <?php
  2. function demo1()
  3. {
  4. // return func_num_args();
  5. // return func_get_arg(1);
  6. // return func_get_args();
  7. $sum = 0;
  8. for ($i = 0; $i < func_num_args(); $i++) {
  9. $sum += func_get_arg($i);
  10. }
  11. return $sum;
  12. }
  13. print_r(demo1(3, 4, 6, 7, 8, 52, 4,));

4.4.2 第二种方式,foreach 循环

  1. <?php
  2. function demo1()
  3. {
  4. $sum = 0;
  5. // 第二种办法
  6. foreach (func_get_args() as $value) {
  7. $sum += $value;
  8. }
  9. return $sum;
  10. }
  11. print_r(demo1(3, 4, 6, 7, 8, 52, 4,));

4.4.3 剩余参数

  • ...参数归纳,使用在参数列表中,表示收集,将多个离散的参数打包到一个数组中处理
  • ...调用参数,表示展开/还原一个数组为离散值
  • 不会限制用户传入数据的数量,功能很强大
  1. //剩余参数
  2. // ...:参数归纳,使用在参数列表中,表示收集,将多个离散的参数打包到一个数组中处理
  3. function demo2(...$args): float
  4. {
  5. // return $args;
  6. return array_sum($args);
  7. // return array_product($args);
  8. }
  9. // ...:调用参数,表示展开/还原一个数组为离散值
  10. $arr = [3, 4, 6, 7];
  11. print_r(demo2(...$arr));

5. 回调函数

语法 类型 执行方式 应用场景
匿名函数 闭包Closure 异步 函数参数
  • 回调函数:用在函数的回调参数中

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

  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));
  • 用在函数的参数中
  1. // 过滤空值/假值
  2. // array_filter仅返回结果为trus的数据
  3. $res = array_filter($res, function ($item) {
  4. return $item;
  5. });
  6. $res = array_values($res);
  7. printf('<pre>%s</pre>', print_r($res, true));

6. 命名空间

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

目的是为了方式全局成员的命名冲突(全局成员:函数,常量,类,接口)

  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. }
  1. // 全局空间不需要名称
  2. namespace {
  3. echo \ns1\demo1();
  4. echo '<hr>';
  5. echo \ns2\demo1();
  6. }

总结

本节课结束了函数的学习,用一句最经典的话来概括就是:函数是为了代码的共享,和变量的目的是为了数据的共享一致,与此同时函数是一个全局变量,可以在页面的任何位置调用函数,发现 PHP 的真正威力源自于它的函数。

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