博客列表 >PHP高级编程函数的返回值和闭包与作用域

PHP高级编程函数的返回值和闭包与作用域

wen。
wen。原创
2021年02月04日 16:52:02882浏览

一、函数

在PHP程序编译时,函数是不分大小写的,变量区分大小写,这个和其他编程时有所不同;

1.1 函数语法

  1. function 函数名称(限定类型 参数列表) : 返回值类型
  2. {
  3. // 函数体
  4. return 返回值;
  5. // 没有return,返回NULL
  6. }

1.2 函数声明

函数声明分为命名函数和匿名函数

函数声明 标识 特点
命名函数 标识符 命名函数自动提升到脚本的顶部,在全局任何地方都可以调用到
匿名函数 变量 需要定义变量才能够调用,不能够在函数未定义前调用
  • 命名函数
    1. function site(){
    2. echo 'php.cn';
    3. }
    4. echo site();
  • 匿名函数
    1. $url = function(){
    2. return 'www.baidu.cpm';
    3. };
    4. echo $url();

二、函数的返回值

函数只允许有一个返回值,当我们需要返回多个值的时候,又应该如何解决呢?

2.1 数组

  1. //数组
  2. function state(): array
  3. {
  4. return ['status' => '1', 'message' => '验证通过'];
  5. }
  6. $res = state();
  7. //var_dump($res);
  8. echo $res['status'] == 1 ? $res['message'] : '验证失败';
  9. //打印 验证通过

2.2 对象

  1. //对象
  2. function getUser(): object
  3. {
  4. return new class
  5. {
  6. public $name = 'admin';
  7. public $email = '923617189@qq.com';
  8. };
  9. }
  10. $user = getUser();
  11. //var_dump($user);
  12. printf('name=%s<br>email=%s', $user->name, $user->email);
  13. // 打印
  14. // name=admin
  15. // email=923617189@qq.com

2.3 序列化

函数 描述
serialize() 把字符串转换成序列化
unserialize() 反序列化,把序列化转换成字符串
json_encode() 把字符串转换成JSON格式
json_decode() 反JSON格式,把JSON格式转换成对象(默认对象),也可以转换成数组类型
  • serialize()

    1. //序列化的数据类型就是字符串类型
    2. function movies() : string
    3. {
    4. return serialize(['id'=>1,'movie'=>'豆瓣电影']);
    5. }
    6. $movie = movies();
    7. echo $movie;
    8. //把序列化字符串保存到文本中,并且创建文件
    9. file_put_contents('file.txt',$movie);
  • unserialize()

    1. //在php中使用时要还原成原来的类型
    2. $arr = unserialize($movie);
    3. var_dump($arr);
    4. //打印 array(2) { ["id"]=> int(1) ["movie"]=> string(12) "豆瓣电影" }
  • json_encode()

    1. //3.2 转为通用json格式的字符串
    2. //这样就可以与其他编程语言进行数据交换,例如 js、java、python
    3. function success(){
    4. //return json_encode(['status'=>1,'message'=>'验证成功'],JSON_UNESCAPED_UNICODE);
    5. return json_encode(['status'=>1,'message'=>'验证成功']);
    6. }
    7. $res = success();
    8. var_dump($res);
    9. //打印 string(48) "{"status":1,"message":"\u9a8c\u8bc1\u6210\u529f"}"
  • json_decode()

    1. //如果当前脚本接收到一个前端或其他接口发送过来的json格式的数据,可以进行解析
    2. //解析的目的是将外部的json还原成php能够处理的数据类型
    3. $res = json_decode(success());
    4. var_dump($res);
    5. echo '<br>';
    6. //打印 object(stdClass)#2 (2) { ["status"]=> int(1) ["messag"]=> string(12) "验证成功" }
    7. //默认将外部的json解析成object对象类型
    8. printf('status =>%d, message => %s',$res->status,$res->message);
    9. //打印 status =>1, message => 验证成功
    10. echo '<br>';
    11. //如果不喜欢对象的方式访问,也可以使用数组方式
    12. //给 json_decode() 第二个参数,传入true
    13. $res = json_decode(success(),true);
    14. var_dump($res);
    15. //打印 array(2) { ["status"]=> int(1) ["message"]=> string(12) "验证成功" }

三、函数的参数

函数的参数传参有多种形式,可以应用在不同的实战场景

3.1 必选参数

  1. //必选参数
  2. function userName($name) : string
  3. {
  4. return 'Hello ' . $name;
  5. }
  6. echo userName('Tome');

3.2 可选参数

  1. //可选参数
  2. function userName($name = 'Tome') : string
  3. {
  4. return 'Hello ' . $name;
  5. }
  6. echo userName();
  7. //打印 Hello Tome
  8. echo userName('Jack');
  9. //打印 Hello Jack
  10. //如果输入参数会覆盖默认参数值

3.3 不定参数

  1. //不定参数
  2. function getArgs(...$args){
  3. $count = count($args);
  4. $array = implode(', ',$args);
  5. $arg = $args[1];
  6. $sum = array_sum($args);
  7. printf('参数数量: %d<br>参数数组: [%s]<br>第2个参数: %d<br>参数总和: %d',$count,$array,$arg,$sum);
  8. }
  9. getArgs(1,2,3,4);
  10. // 参数数量: 4
  11. // 参数数组: [1, 2, 3, 4]
  12. // 第2个参数: 2
  13. // 参数总和: 10
  14. //实战:数据表查询
  15. function connect(...$args)
  16. {
  17. //print_r($args);
  18. return new PDO($args[0], $args[1], $args[2]);
  19. }
  20. $pdo = connect('mysql:dbname=mysql', 'root', 'root');
  21. if ($pdo) {
  22. echo '连接成功';
  23. } else {
  24. echo '连接失败';
  25. }

3.4 引用参数

  1. //引用参数
  2. //js函数参数只支持值传递
  3. //php支持"值传递"和"引用传递"
  4. //参数默认就是值传递
  5. //引用传参: 在函数内部对参数的任何更新都会映射到外部的参数中
  6. $name = 'Tome';
  7. function nickName($name){
  8. $name = 'Jack';
  9. return $name;
  10. }
  11. nickName($name);
  12. echo "\$name = " . $name;
  13. //打印 $name = Tome
  14. //使用引用传参
  15. //应用场景 对象处理
  16. function nickName2(&$name){
  17. $name = 'Panghu';
  18. }
  19. nickName2($name);
  20. echo "\$name = " . $name;
  21. //打印 $name = Panghu

四、函数作用域

函数作用域,只有调用它的时候才会被创建

4.1 global

  1. $name = 'Tome';
  2. function getUser() : string
  3. {
  4. //函数作用域,只有调用它的时候才会被创建
  5. $res = '';
  6. //如果想在函数内部访问全局/外部的成员
  7. //有二种方式可以在函数内部访问外部成员
  8. //1. global
  9. global $name;
  10. $res .= '$name = ' . $name . '<br>';
  11. return $res;
  12. }
  13. echo getUser();
  14. //打印
  15. // $name = Tome

4.2 $GLOBAL

超全局数组不受作用域限制

  1. $email = '923617189@qq.com';
  2. function getUser() : string
  3. {
  4. //函数作用域,只有调用它的时候才会被创建
  5. $res = '';
  6. //$GLOBALS,超全局数组不受作用域限制
  7. $res .= '$email = ' . $GLOBALS['email'];
  8. return $res;
  9. }
  10. echo getUser();
  11. //打印
  12. // $email = 923617189@qq.com

五、闭包函数

闭包也叫匿名函数

5.1 use

  1. //1. 闭包支持引用传参: 参数前加&
  2. echo '当前: $name = ' . $name . '<br>';
  3. //当前: $name = Tome
  4. $getName = function () use (&$name)
  5. {
  6. $name = 'Jack';
  7. };
  8. $getName();
  9. echo '现在: $name = ' . $name . '<br>';
  10. //打印 现在: $name = Jack
  11. //2. 引用参数
  12. $getName2 = function ($nickname) use(&$name)
  13. {
  14. $name = $nickname;
  15. };
  16. $getName2('Panghu');
  17. echo '现在: $name = ' . $name . '<br>';
  18. //打印 现在: $name = Panghu
  19. // use禁止使用一下三种参数
  20. // 1. 超全局不让用: $_GET;
  21. // 2. $this
  22. // 3. 与当前参数重名不让用
  23. //闭包经常用作函数的返回值
  24. function getUrl($site)
  25. {
  26. return function ($color) use ($site){
  27. return sprintf("<h3 style='color:%s'>%s<h3>",$site,$color);
  28. };
  29. }
  30. echo getUrl('red')('php.cn');
  31. //打印 <h3 style="color:red">php.cn</h3>
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议