zoukankan      html  css  js  c++  java
  • global $GLOBALS区别

    <?php
    function &test(){
        static $b=0;//申明一个静态变量
        $b=$b+1;
        echo $b;
        return $b; }
    }
    $a=test();//这条语句会输出 $b的值 为1
    $a=5; $a=test();//这条语句会输出 $b的值 为2
    $a=&test();//这条语句会输出 $b的值 为3
    $a=5; $a=test();//这条语句会输出 $b的值 为6
    ?>

    下面解释下:  通过这种方式$a=test();得到的其实不是函数的引用返回,这跟普通的函数调用没有区别 至于原因: 这是PHP的规定 PHP规定通过$a=&test(); 方式得到的才是函数的引用返回 至于什么是引用返回呢(PHP手册上说:引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。) 这句狗屁话 害我半天没看懂

           用上面的例子来解释就是 $a=test()方式调用函数,只是将函数的值赋给$a而已, 而$a做任何改变,都不会影响到函数中的$b,而通过$a=&test()方式调用函数呢, 他的作用是 将return $b中的 $b变量的内存地址与$a变量的内存地址 指向了同一个地方 即产生了相当于这样的效果($a=&b;) 所以改变$a的值 也同时改变了$b的值 所以在执行了 $a=&test(); $a=5; 以后,$b的值变为了5

    <?php 
    // 例子1 
    function test_global() { 
    global $var1, $var2; 
    $var2 =& $var1; 
    } 
    function test_globals() { 
    $GLOBALS['var3'] =& $GLOBALS['var1']; 
    } 
    $var1 = 5; 
    $var2 = $var3 = 0; 
    test_global(); 
    print $var2 ." "; 
    test_globals(); 
    print $var3 ." "; 
    ?>

    执行结果为: 
    0 
    5

    <?php 
    // 例子2 
    function test() { 
    global $a; 
    unset($a); 
    } 
    $a = 1; 
    test(); 
    print $a; 
    ?> 

    复制代码 
    执行结果为: 
    1 
    为什么会输出1呢?不是已经把$a给unset了吗?unset失灵了?php的bug? 
    都不是,其实unset起作用了,是把test函数中的$a给unset掉了,可以在函数后面加入 
    print $a; 
    复制代码 
    来测试!也就是说global产生了test函数外部$a的别名变量“$a”,为了和外面的$a区别,我把它成为--test->$a,那么例子1也这么命名的话,可得出下面的图: 
    而test_globals执行过以后,看变量的变化: 
    此时,看图,就能理解为什么例子1执行完以后,$var2是0,而$var3是5了! 
    所以我们得出一个结论,在函数中global和$GLOBALS[]的区别在于: 
    global在函数产生一个指向函数外部变量的别名变量,而不是真正的函数外部变量,一但改变了别名变量的指向地址,就会发生一些意料不到情况(为什么会打印结果为2呢?

    其实就是因为$var1的引用指向了$var2的引用地址。导致实质的值没有改变。这时候只是指向$var1的指针指向了$var2的指针,只是指针指向变了一下,

    但是实质上根本就没有改变$var2的值,因此$var2的值仍旧不会变化),例如例子1. 
    $GLOBALS[]确确实实调用是外部的变量,函数内外会始终保持一致! 
    注:(接着回到上面的例子1,看test_global中的这一代码“$var2 =& $var1;”,上面是一个引用赋值运算,也就是$var2将指向var1所指向的物理内存地址,

    所以例子1执行过test_global函数以后,变量的变化只在函数的局部产生效应,在函数外部$var2的指向物理内存地址并没有变化,还是它自己.(重点) 
    接着回到上面的例子1,看test_global中的这一代码“$var2 =& $var1;”,上面是一个引用赋值运算,也就是$var2将指向var1所指向的物理内存地址,所以例子1执行过test_global函数以后,变量的变化由下图可以看出)

  • 相关阅读:
    c++开发之对应Linux下的sem_t和lock
    嵌入式开发之davinci--- 8148/8168/8127 中的图像处理算法优化库vlib
    crc32 冗余加密校验
    快速安装 GitLab 并汉化
    oracle-6-密码文件
    oracle-5-的升级步骤
    Linux大文件已删除,但df查看已使用的空间并未减少解决
    cygwin 的不同文件类型显示不同的颜色
    PLSQL的安装
    网络流量监控工具----iftop
  • 原文地址:https://www.cnblogs.com/andydao/p/4997116.html
Copyright © 2011-2022 走看看