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 相关文章推荐
php面向对象全攻略 (六)__set() __get() __isset() __unset()的用法
Sep 30 PHP
深入理解PHP之数组(遍历顺序)  Laruence原创
Jun 13 PHP
如何在PHP中使用正则表达式进行查找替换
Jun 13 PHP
php include和require的区别深入解析
Jun 17 PHP
PHP实现服务器状态监控的方法
Dec 09 PHP
Codeigniter实现发送带附件的邮件
Mar 19 PHP
php实现常见图片格式的水印和缩略图制作(面向对象)
Jun 15 PHP
laravel框架的安装与路由实例分析
Oct 11 PHP
laravel通过a标签从视图向控制器实现传值
Oct 15 PHP
PHP PDO和消息队列的个人理解与应用实例分析
Nov 25 PHP
PHP实现chrome表单请求数据转换为接口使用的json数据
Mar 04 PHP
PhpSpreadsheet中文文档 | Spreadsheet操作教程实例
Apr 01 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下编码转换函数mb_convert_encoding与iconv的使用说明
2009/12/16 PHP
phpmailer在服务器上不能正常发送邮件的解决办法
2014/07/08 PHP
PHP自定义函数获取URL中一级域名的方法
2016/08/23 PHP
PHP + plupload.js实现多图上传并显示进度条加删除实例代码
2017/03/06 PHP
php获取用户真实IP和防刷机制的实例代码
2018/11/28 PHP
PHP设计模式之外观模式(Facade)入门与应用详解
2019/12/13 PHP
javascript读取RSS数据
2007/01/20 Javascript
jQuery.query.js 取参数的两点问题分析
2012/08/06 Javascript
JavaScript设置IFrame高度自适应(兼容各主流浏览器)
2013/06/05 Javascript
jQuery function的正确书写方法
2013/08/02 Javascript
JS调试必备的5个debug技巧
2014/03/07 Javascript
jquery ajax应用中iframe自适应高度问题解决方法
2014/04/12 Javascript
javascript正则表达式参数/g与/i及/gi的使用指南
2014/08/27 Javascript
alert出数组中的随即值代码
2014/09/25 Javascript
JS跨域问题详解
2014/11/25 Javascript
firefox浏览器用jquery.uploadify插件上传时报HTTP 302错误
2015/03/01 Javascript
AngularJs动态加载模块和依赖注入详解
2016/01/11 Javascript
使用Object.defineProperty实现简单的js双向绑定
2016/04/15 Javascript
浅谈JS的基础类型与引用类型
2016/09/13 Javascript
PHP+jquery+ajax实现分页
2016/12/09 Javascript
Javascript Event(事件)的传播与冒泡
2017/01/23 Javascript
使用vue框架 Ajax获取数据列表并用BootStrap显示出来
2017/04/24 Javascript
Angular实现较为复杂的表格过滤,删除功能示例
2017/12/23 Javascript
webpack-mvc 传统多页面组件化开发详解
2019/05/07 Javascript
jQuery实现穿梭框效果
2021/01/19 jQuery
[02:04]2018DOTA2亚洲邀请赛Secret赛前采访
2018/04/03 DOTA
Numpy中stack(),hstack(),vstack()函数用法介绍及实例
2018/01/09 Python
OpenCV HSV颜色识别及HSV基本颜色分量范围
2019/03/22 Python
CSS3 3D制作实战案例分析
2016/09/18 HTML / CSS
德国亚洲食品网上商店:asiafoodland.de
2019/12/28 全球购物
测绘工程本科生求职信
2013/10/10 职场文书
结婚典礼证婚词
2014/01/11 职场文书
支行行长竞聘演讲稿
2014/05/15 职场文书
2016年感恩母亲节活动总结
2016/04/01 职场文书
用golang如何替换某个文件中的字符串
2021/04/25 Golang
MySQL脏读,幻读和不可重复读
2022/05/11 MySQL