• php中在局部作用域内访问全局变量


    php中,由于作用域的限制,导致变量的访问限制:

    1、局部作用域内不能访问全局变量

    2、全局作用域内不能访问局部变量

     对于第一种情况,如下代码将不能正常运行:

    <?php
      //局部作用域(函数内)使用全局变量
      $a = 1;//在全局作用域内的变量
      function test() {
        echo "a = {$a}<br />";//在局部作用域中访问全局作用域变量
      }
    
      test();
    
      /*
      运行结果:
      Notice: Undefined variable: a in /Users/lyq/mysite/index.php on line 11
      a = 
      */
    ?>

    那么要想在局部作用域内正常使用全局作用域变量,该怎么做呢?

    方法一:在局部作用域内,使用global关键字声明与全局作用域变量名称相同的变量即可。原因:这样声明之后,全局作用域内的变量和局部作用域内与之同名的变量指向了同一块内存。让代码说话:

    <?php
      //局部作用域(函数内)使用全局变量
      $a = 1;//在全局作用域内的变量(暂时称之为“外部的$a”)
      function test() {
        /*
          为了使用外部的$a,在此处通过global关键字声明一个与之名称相同的
          变量“$a”(暂时称之为“内部的$a”),这两个变量指向同一块内容,顾可以在局部作用域内正常使用和修改。
        */
        global $a;//如果不声明,将不能正常使用外部的$a
        echo "a = {$a}<br />";//在局部作用域中访问全局作用域变量
    
        $a  = 100;//通过内部的$a,来修改$a的值

      /*
        注意:这么做不会销毁变量,因为此时已经有两个引用指向了这块内容,这么做仅仅是断开了一个引用而已
        所以,如果解注释下面一行的代码,运行结果依然正常.
      */
      //unset($a);
    } test(); echo "在test函数内部修改了$a的值,此时$a = $a"; /* 运行结果: a = 1 在test函数内部修改了$a的值,此时$a = 100 */ ?>

    方法二:使用$GLOBALS来访问全局变量。

    <?php
      //局部作用域(函数内)使用全局变量
      $a = 1;//在全局作用域内的变量
      function test() {
        /*
          使用$GLOBALS来访问$a的值:$GLOBALS对全局变量的使用,可以看做是全局变量的
          另一种语法形式,而不是“引用”关系
        */
        echo "a = {$GLOBALS['a']}<br />";//在局部作用域中使用$GLOBALS访问全局作用变量
    
        $GLOBALS['a']  = 100;//通过$GLOBALS['a'],来修改$a的值
        /*
          由于$GLOBALS['a']仅仅是全局变量$a的另一种语法形式,所以使用$GLOBALS['a']并不会
          建立新的引用,所以如果调用了下面的代码,程序将不能正常运行,输出结果:
    
          a = 1
    
          Notice: Undefined variable: a in /Users/lyq/mysite/index.php on line 21
          在test函数内部修改了$a的值,此时$a =
        */
        //unset($GLOBALS['a']);
      }
      test();
      echo "在test函数内部修改了$a的值,此时$a = $a";
    
      /*
        运行结果:
        a = 1
        在test函数内部修改了$a的值,此时$a = 100
      */
    ?>

    注意:

    通过方法一来使用全局变量$a,实际上是建立了一个新的引用,所以如果使用unset($a),这个时候是不会销毁变量的。如果将方法一代码的"//unset($a);"解注释后运行,仍然能输出正确的结果。但是$GLOBALS['a']仅仅是是全局变量的的另一种语法形式,并没有建立新的引用,所以,如果解注释方法二中的"//unset($GLOBALS['a']);",程序将无法正常运行。

  • 相关阅读:
    Spark——为数据分析处理提供更为灵活的赋能
    秋读|10本热门图书(人工智能、编程开发、架构、区块链等)免费送!
    使用Phaser开发你的第一个H5游戏(一)
    Java web 服务启动时Xss溢出异常处理笔记
    为什么我打的jar包没有注解?
    收集、分析线上日志数据实战——ELK
    阿里云PolarDB及其共享存储PolarFS技术实现分析(下)
    14.5 富文本编辑【JavaScript高级程序设计第三版】
    【收藏】15个常用的javaScript正则表达式
    C# 网络请求
  • 原文地址:https://www.cnblogs.com/benbenzhu/p/5591794.html
Copyright © 2020-2023  润新知