PHP中$GLOBALS与global的区别详解


Posted in PHP onMarch 21, 2019

PHP中$GLOBALS和global都可以实现全局变量的功能,所以很多人都认为global和$GLOBALS[]只是写法上面的差别,其实不然。$GLOBALS 是一个超级全局变量,其实是一个数组,而global 则是一个声明全局变量的关键字!

一、超全局变量$GLOBALS

PHP超全局变量有很多,如下的都属于超全局变量(Superglobal):

$GLOBALS,$_SERVER,$_GET,$_POST,$_FILES,$_COOKIE,$_SESSION,$_REQUEST,$_ENV。

官方说明:

$GLOBALS — 引用全局作用域中可用的全部变量。

一个包含了全部变量的全局组合数组。变量的名字就是数组的键。

即出现过的全局变量,就可以通过$GLOBALS这个数组取得。

  • $GLOBALS['var'] 是外部的全局变量$var本身。
  • global $var 是外部$var的同名引用或者指针。(错误:是个别名引用而已,非指针!!!)

PHP生命周期中,定义在函数体外部的所谓全局变量,函数内部是不能直接获得的。

$foo="Example content";
test();
function test(){
  $foo="local variable";
  echo '$foo in current scope: '.$foo."<br>";
  echo '$foo in global scope: '.$GLOBALS["foo"]."<br>";
}

如上的例子,要访问外部的$foo必须使用 $GLOBALS 数组。对于通过include文件进来的外部全局变量也适用。

php中global也有这样的功能,它和$GLOBALS的区别在于:

global在函数产生一个指向函数外部变量的别名变量,而不是真正的函数外部变量。

$GLOBALS[]确确实实调用是外部的变量,函数内外会始终保持一致。

对于类中的成员变量,类中函数必须使用$this->的方式访问,不能用$GLOBALS方式:

global的作用是定义全局变量,但是这个全局变量不是应用于整个网站,而是应用于当前页面,包括include或require的所有文件。

二、实例讲解

function t1(){
  global $var1,$var2;
  $var2=&$var1;
}
function t2(){
  $GLOBALS['var3']=&$GLOBALS['var1'];
}
$var1=5;
$var2=$var3=0;
t1();
print $var2."\n";
t2();
print $var3."\n";

执行结果为:

0
5

为什么不是2个5而是1个0和1个5呢?再修改一下例子:

function t1(){
  global $var1;
  $var1=2;
  unset($var1);
}
function t2(){
  $GLOBALS['var1']=3;
  unset($GLOBALS['var1']);
}
$var1=1;
t1();
print $var1."\n";
t2();
print $var1."\n";

执行结果只输入一个2;

1、$GLOBALS是由所有已定义全局变量自动形成的数组。变量名就是该数组的索引。即$GLOBALS['var1']与函数外部的变量$var1是同一个变量,所以将$GLOBALS['var1'] 删除后,该变量已不存在,所有无法输出了。

注:$GLOBALS是自动全局变量。这意味着它在所有的脚本中都有效。在函数或方法中不需要使用 global $GLOBALS;来访问它。

2、"global $var1;"是产生了函数外部$var1的别名变量"$var1",它不是真正的函数外部变量,他只存在于函数的内部,所以即使在函数内将别名变量删除也不会影响外面的变量,但是可以修改函数外部变量的值。

或许有的人总想知道这个或那个的区别:

在php程序,包括其他程序的学习中,自己动手实验,根据结果加上的思考,有的时候比上网查找可能会来得更快一些,更准确一些。下面我们来讲一下,php在全局范围内访问变量要怎么办?

例一:global定义全局变量。

function test_global(){
  global $var1;
  $var1='ok';
  unset($var1);
}
test_global();
$var2=&$var1;
unset($var1);
echo $var2;

先不给出结果,自己运行一下程序。函数内部的变量可以访问到了。从结果可以看出,unset只是断开变量名与变量值连接,并没有马上销毁变量的值,而且在函数内部定义的全局变量,实际在外部只是使用了函数内部的别名而已,所以我们在外面依然可以访问$var1。

例二:$GLOBALS在函数内部访问函数外面定义的变量。

$codetc='out';
function ff(){
  echo $GLOBALS['codetc'];
}
ff();

直接在函数内部使用$codetc是会出错的。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

PHP 相关文章推荐
文章推荐系统(二)
Oct 09 PHP
用PHP实现Ftp用户的在线管理的代码
Mar 06 PHP
PHP 分页原理分析,大家可以看看
Dec 21 PHP
探讨PHP JSON中文乱码的解决方法详解
Jun 06 PHP
php使浏览器直接下载pdf文件的方法
Nov 15 PHP
php中出现空白页的原因及解决方法汇总
Jul 08 PHP
php基于base64解码图片与加密图片还原实例
Nov 03 PHP
php函数serialize()与unserialize()用法实例
Nov 06 PHP
smarty中post用法实例
Nov 28 PHP
在laravel中使用with实现动态添加where条件
Oct 10 PHP
laravel框架查询数据集转为数组的两种方法
Oct 10 PHP
阿里对象存储OSS在laravel框架中的使用方法
Oct 13 PHP
PHP压缩图片功能的介绍
Mar 21 #PHP
PHP应用跨时区功能的实现方法
Mar 21 #PHP
PHP时间函数使用详解
Mar 21 #PHP
PHP抽象类与接口的区别详解
Mar 21 #PHP
PHP CURL使用详解
Mar 21 #PHP
使用ucenter实现多站点同步登录的讲解
Mar 21 #PHP
PHP设计模式之工厂模式(Factory Pattern)的讲解
Mar 21 #PHP
You might like
PHP实现适用于文件内容操作的分页类
2016/06/15 PHP
用JavaScript获取DOM元素位置和尺寸大小的方法
2013/04/12 Javascript
node.js中的fs.lstatSync方法使用说明
2014/12/16 Javascript
jQuery多级手风琴菜单实例讲解
2015/10/22 Javascript
JS实现字符串转日期并比较大小实例分析
2015/12/09 Javascript
浅谈js中的三种继承方式及其优缺点
2016/08/10 Javascript
Jquery与Bootstrap实现后台管理页面增删改查功能示例
2017/01/22 Javascript
详解React-Native解决键盘遮挡问题(Keyboard遮挡问题)
2017/07/13 Javascript
详解webpack + vue + node 打造单页面(入门篇)
2017/09/23 Javascript
EasyUI的DataGrid绑定Json数据源的示例代码
2017/12/16 Javascript
AngularJs点击状态值改变背景色的实例
2017/12/18 Javascript
vue项目常用组件和框架结构介绍
2017/12/24 Javascript
JavaScript数据结构与算法之检索算法示例【二分查找法、计算重复次数】
2019/02/22 Javascript
使用Bootstrap做一个朝代历史表
2019/12/10 Javascript
基于jQuery实现挂号平台首页源码
2020/01/06 jQuery
JS校验与最终登陆界面功能完整示例
2020/01/13 Javascript
jQuery弹框插件使用方法详解
2020/05/26 jQuery
python通过pil为png图片填充上背景颜色的方法
2015/03/17 Python
python 把数据 json格式输出的实例代码
2016/10/31 Python
Python3 加密(hashlib和hmac)模块的实现
2017/11/23 Python
使用Python来开发微信功能
2018/06/13 Python
详解Python3序列赋值、序列解包
2019/05/14 Python
Python压缩模块zipfile实现原理及用法解析
2020/08/14 Python
HTML5 声明兼容IE的写法
2011/05/16 HTML / CSS
澳大利亚百货公司:David Jones
2018/02/08 全球购物
Bailey帽子官方商店:Bailey Hats
2018/09/25 全球购物
HolidayLettings英国:预订最好的度假公寓、别墅和自助式住宿
2019/08/27 全球购物
什么是虚拟内存?虚拟内存有什么优势?
2016/02/09 面试题
网络教育自我鉴定
2013/11/01 职场文书
大家访活动实施方案
2014/03/10 职场文书
大学生党员批评与自我批评范文
2014/10/14 职场文书
卢旺达饭店观后感
2015/06/05 职场文书
工程主管竞聘书
2015/09/15 职场文书
谢师宴学生答谢词
2015/09/30 职场文书
Mysql - 常用函数 每天积极向上
2021/04/05 MySQL
win10忘记pin密码登录不了怎么办?win10忘记pin密码登不进去的解决方法
2022/07/07 数码科技