登录  /  注册

php中global与$GLOBALS[

墨辰丷
发布: 2018-05-15 17:07:29
原创
4615人浏览过

本篇文章主要介绍php中global与$GLOBALS[' ']的区别 ,感兴趣的朋友参考下,希望对大家有所帮助。

一直以为在php中global和$globals[’ ‘]没有什么差别,今天查了一下,发现两者的有很大的差别.特作出以下总结:
global $var : 是指向全局变量$var的一个引用;
$globals[“var”] : 是全局变量 $var本身, 即等价于$var.
下面举几个例子:
例1:

<?php
    $var1 = 1;    
    $var2 = 2;    
    function test() {
        $GLOBALS[&#39;var2&#39;] = &$GLOBALS[&#39;var1&#39;];
    }
    test();   
    echo $var2;//输出1
?>
登录后复制

test() 函数中$GLOBALS[‘var2’] 相当于全局变量$var1,
$GLOBALS[‘var2’] = $GLOBALS[‘var1’] 作用是将$var2变为$var1的引用,即$var2是$var1的别名,两者指向同一个内存空间,所以\$var2的值变为1。

例2:

<?php
    $var1 = 1;    
    $var2 = 2;    
    function test(){
        global $var1, $var2;        
        $var2 = &$var1;        
        echo $var2;        
        $var2 = &#39;hello...&#39;;
    }
    test(); // 输出 1
    echo $var2; // 输出 2
    echo $var1; // 输出 hello...
?>
登录后复制

在test函数中 $var1和$var2分别是全局变量$var1和$var2的引用(即别名)
$var2 = &$var1; //test函数中的$var2(局部变量)的值更改为该函数内的$var1的引用
此时test函数中$var2的值等于该函数中$var1的值,也等于全局变量中$var1的值,三者指向同一块内存空间,当test函数中的$var2的值发生变化时,另外两个(test函数中的$var1和全局变量中的$var1)的值也随之发生变化。

例3.

<?php
    $var1 = 1;    
    function test(){
        unset($GLOBALS[&#39;var1&#39;]);
    }
    test();    
    echo $var1;
?>
登录后复制

正如上面所讲到的,$GLOBALS[‘var1’] 与 全局变量中的$var1是等价的,unset($GLOBALS[‘var1’] );等价于将全局变量$var1销毁,所以打印空
补充:
php中unset()函数是用来销毁变量的,在很多时候,它只是将变量销毁,但内存里面的值并没有销毁(即unset()函数指数切断变量与内存之间的关系,将变量名销毁,内存里面的值并没有销毁,内存也没有释放),需要注意的是:
1. 该函数只在变量所占的内存超过256个字节的时候,才会将内存释放。
2. 只有在所有指向该变量所指向的内存的变量(如该变量的所有引用)都被销毁,地址才会被释放。

例4.

<?php
    $var1 = 1;    
    function test(){
        global $var1;        
        unset($var1);
    }
    test(); 
    echo $var1; //结果为打印1
?>
登录后复制

在这段代码里,test()函数中使用global定义的变量其实只是一个指向全局变量$var的引用,在test()函数中销毁该变量相当于销毁了全局变量的一个引用(一块内存,有两个名字,删去其中的一个名字,对另一个名字和该内存的值并不会有影响),所以,当在打印全局变量$var时,结果仍是1。该段代码与下面的代码所进行的操作是类似的:

<?php
    $var = 1;    
    $var1 = &$var;    
    unset($var1);    
    echo $var;
?>
登录后复制

再看一个在函数内部引用全局变量的例子:

<?php
    $var1 = "我是变量var1的值";    
    $var2 = "我是变量var2的值";    
    function global_references($use_globals) {
        global $var1, $var2;        
        if (!$use_globals) {            
        $var2 = &$var1;            
        echo $var1;            
        echo $var2;            
        echo "<br />";
        } else {            
        $GLOBALS["var2"] = &$var1;            
        echo $var1;            
        echo $var2;            
        echo "<br />";
        }
    }
    global_references(false);
    //1.打印:我是变量var1的值我是变量var1的值
    echo $var1;    
    echo $var2;    
    echo "<br />"; 
    //2.打印:我是变量var1的值我是变量var2的值

    global_references(true); 
    //3.打印:我是变量var1的值我是变量var2的值
    echo $var1;    
    echo $var2;    
    echo "<br />"; 
    //4.打印:我是变量var1的值我是变量var1的值
?>
登录后复制
  1. 因为参数为false,所以执行if里面的语句,将global_references()函数内声明的原本为全局变量var2引用的var2的值变为var1的引用,所以global_references()函数内打印的两个变量都是全局变量var1的引用。

  2. 1执行的语句并没有对全局变量的值产生影响,所以打印的还是程序开始声明的值。

  3. 因为参数为true,所以执行else里面的语句,将全局变量var1的值变为全局变量var1的引用(global_references()函数内声明的var1)的引用,这并没有改变global_references()中声明的var2的值(仍为原来内存的引用)。

  4. 经过3之后,全局变量var2已经成为全局变量var1的引用了,所以此时两个全局变量的值相同。

总结:
global $var : 是指向全局变量$var的一个引用;
$GLOBALS[“var”] : 是全局变量 $var本身, 即等价于$var.
前者若是在函数内部声明的变量,其作用域为该函数,即只在该函数内可见,这个变量是一个指向全局变量的引用,销毁该变量并不会对其所指向的全局变量有影响。

相关推荐:

PHP读取外部变量$GLOBALS

PHP json_encode($GLOBALS)出错的原因

php中的const和global

以上就是php中global与$GLOBALS[的详细内容,更多请关注php中文网其它相关文章!

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
最新问题
关于CSS思维导图的课件在哪? 课件
凡人来自于2024-04-16 10:10:18
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号