在PHP中经常遇到$GLOBALS和global来定义和访问全局变量,那么在什么地方该用$GLOBALS,而什么地方该用global呢?这就需要我们清除了解$GLOBALS和global的区别,我也谈谈PHP中$GLOBALS和global的不同,要真正弄懂它们的区别和共同点请仔细看这篇文章。

$GLOBALS和global的本质不同

$GLOBALS和global不光有区别,还有本质不同。

$GLOBALS是一个数组,它是一个包含了全部变量的全局组合数组。而global是一个PHP关键字,它可以将一个变量的作用域变成全局的。在PHP官方手册中有这句话:

The global keyword is used to manipulate variable scope, and there is also the concept of super globals in PHP, which are special variables with a global scope.

也就是说,global声明一个变量,这个变量就具有全局作用域。比如在函数内部要访问函数外部定义的一个变量,就要用global关键字在函数内部声明这个变量。或者在函数内部声明了一个变量是global,那么在函数外部通过global声明这个变量,也就可以全局访问了。

$GLOBALS使用范例

$GLOBALS使用示例1:

function test() {

$foo = "local variable";

echo '$foo in global scope: ' . $GLOBALS["foo"] . "\n";

echo '$foo in current scope: ' . $foo . "\n";

}

$foo = "Example content";

test();

?>

在该例中,有两个$foo,一个在函数内,一个在函数外,它们的作用域不同,一个作用域是函数内的,一个作用域是全局的,这个全局指的是在这个php文件中,或者被include或require进的php文件中。我们探讨$GLOBALS和global的区别的时候,重点就是关注变量的作用域。

这个程序的输出结果是:

$foo in global scope: Example content

$foo in current scope: local variable

第一个结果是在函数内部通过$GLOBALS访问全局变量的那个$foo,可以获取并且输出。第二个结果是输出局部变量也就是函数内定义的$foo.

$GLOBALS使用示例2:

function errfunc() {

echo $PHP_SELF;

}

errfunc();

?>

本例中声明了一个变量$PHP_SELF,它的作用域是这个函数内,而直接echo这个变量会出错,因为undefined,没有定义。在PHP中,PHP_SELF这个名字应该很熟悉吧,它是自动生成的一个全局变量,表示当前网页地址。既然是自动生成的全局变量,也就可以通过$GLOBALS来访问了,如下例:

function myfunc() {

echo $GLOBALS["PHP_SELF"];

}

myfunc();

这样通过$GLOBALS访问的PHP_SELF就是全局变量中的,而这个变量很特殊,是系统自动生成的。

global使用示例

global使用示例1

$name='Steve';

function myname(){

global $name;

echo $name;

}

myname();

?>

$name='Steve';

function myname(){

global $name;

echo $name;

}

myname();

?>

这个简单的例子就是在函数内部访问外部全局变量$name然后输出它,如果不用global就会出错。

global使用示例2

function myfunc() {

global $PHP_SELF;

echo $PHP_SELF;

}

myfunc();

?>

function myfunc() {

global $PHP_SELF;

echo $PHP_SELF;

}

myfunc();

?>

和上面的例子作用一样,输出PHP_SELF全局变量。这里用的global,把一个变量作用域变成全局的,这就是global和$GLOBALS的共同点。这里global声明了一个变量$PHP_SELF,就创建了外部变量$PHP_SELF的同名引用或指针,从而访问全局变量,这句话又是讲的global和$GLOBALS的不同点。

通过下面的例子就可以看出global和$GLOBALS的区别:

$var1=1;

$var2=2;

function test(){

global $var1,$var2;

$var2=&$var1;

}

test();

echo $var2;

1

2

3

4

5

6

7

8

$var1=1;

$var2=2;

function test(){

global $var1,$var2;

$var2=&$var1;

}

test();

echo $var2;

结果是:2

为什么结果是2?首先通过global将外部变量$var1,$var2变成全局变量,然后$var2引用$var1,很多人就理解为$var2的值和$var1一样了,但是echo $var2是在函数外部,global是在函数内部创建了外部$var2的同名引用,并不是外部$var2本身,所以函数内部的操作并没有改变外部变量$var2的值。

如果用$GLOBALS,如下例那就改变了$var2的值:

$var1=1;

$var2=2;

function test(){

$GLOBALS['var2']=&$GLOBALS['var1'];

}

test();

echo $var2;

$var1=1;

$var2=2;

function test(){

$GLOBALS['var2']=&$GLOBALS['var1'];

}

test();

echo $var2;

结果是1。因为$GLOBALS变量是自己本身。

再如这个例子证明$GLOBALS[‘var’]是自己本身。

$var1=1;

function test(){

unset($GLOBALS['var1']);

}

test();

echo $var1;

1

2

3

4

5

6

$var1=1;

function test(){

unset($GLOBALS['var1']);

}

test();

echo $var1;

结果是空的。test函数unset把外部全局变量var1卸载了

php中globals,PHP中$GLOBALS和global的区别相关推荐

  1. PHP学习:PHP超全局变量(Superglobal)$GLOBALS的介绍以及和global的区别

    PHP超全局变量有很多,如下的都属于超全局变量Superglobal $GLOBALS,$_SERVER,$_GET,$_POST,$_FILES,$_COOKIE,$_SESSION,$_REQUE ...

  2. globle php,php中global与$GLOBAL的区别分析

    大多数的人都会以为global和$GLOBALS[]只是在写法上面有所不同,但是实际上并不是这样的,下面我们就来看一下它们之间究竟有何区别. 根据官方的解释是 $GLOBALS['var'] 是外部的 ...

  3. 【php】php中global与$GLOBAL['']的区别

    +++ 探讨(一)+++++++++++++++++++++++++++++++++++++++ 很多人都认为global和$GLOBALS[]只是写法上面的差别,其实不然. 根据官方的解释是 $GL ...

  4. [ASP.NET]ASP.NET中的Inherits、CodeFile、CodeBehind的区别详解及OWIN及IDENTITY

    篇一 : ASP.NET中的Inherits.CodeFile.CodeBehind的区别详解 Inherits.CodeFile.CodeBehind 在 ASP.NET 中使用代码隐藏方法来设计W ...

  5. PHP如何进行错误与异常处理(PHP7中的异常处理和之前版本异常处理的区别)

    PHP如何进行错误与异常处理(PHP7中的异常处理和之前版本异常处理的区别) 一.总结 一句话总结: throwable接口+Error类 在PHP7更新中有一条:更多的Error变为可捕获的Exce ...

  6. 媒体查询中“屏幕”和“仅屏幕”之间有什么区别?

    本文翻译自:What is the difference between "screen" and "only screen" in media queries ...

  7. Java Persistence API中的FetchType LAZY和EAGER之间的区别?

    我是Java Persistence API和Hibernate的新手. Java Persistence API中的FetchType.LAZY和FetchType.EAGER什么区别? #1楼 我 ...

  8. js数组中forEach/some/every/map/filter/reduce的区别

    2019独角兽企业重金招聘Python工程师标准>>> // js数组中forEach/some/every/map/filter/reduce的区别// 1. foreach:就是 ...

  9. python中remove函数是什么意思,python中pop函数和remove函数有什么区别

    python中pop函数和remove函数有什么区别 发布时间:2020-12-10 09:36:18 来源:亿速云 阅读:80 作者:小新 小编给大家分享一下python中pop函数和remove函 ...

最新文章

  1. 使用Docker-Docker for Web Developers(2)
  2. 页面布局 - flex弹性布局
  3. 由于找不到appvisvsubsystems32.dll_去固始张街逛一逛,以后可能看不到了......
  4. Android stadio 电脑连上手机可以识别,但是连不上Android stadio
  5. Python正则表达式-2
  6. 信息系统项目管理师-人力资源管理知识点
  7. php 文件位置获取
  8. Junit_@Before@After
  9. id选择器、标签选择器、类选择器、交集选择器、并集选择器
  10. 新年继续发红包,1500元!
  11. C#调用C++类(以COM组件的形式)
  12. 【Pytorch神经网络理论篇】 31 图片分类模型:ResNet模型+DenseNet模型+EffcientNet模型
  13. 数据结构之内部排序算法总结笔记
  14. ios 短信验证码自动填充时总是被复制两遍
  15. 【学习笔记】函数高级使用技巧:建立函数队列
  16. 【图像重建】基于matlab ASTRA算法图像重建【含Matlab源码 090期】
  17. AWS EMR 上 Spark 任务 Container killed Exit code 137 错误
  18. 设置WDS桥接成功,上不了网怎么办?路由器WDS无线桥接设置正确方法
  19. 数据库—Mysql相关
  20. 用 Telegram bot 搭个消息提醒服务

热门文章

  1. ubuntu20.04(linux)系统:报错下列软件包有未满足的依赖关系: deepin-libwine:i386 : 依赖: libncurses5:i386 但是它将不会被安装
  2. L1-077 大笨钟的心情(分数 15)
  3. Easyui 表格中复选框设置单选
  4. 个人下载mysql什么版本_Mysql各个版本区别及官网下载
  5. 容器镜像[容器培训专题]
  6. MVG学习笔记(4) --三视图几何
  7. 【深入设计模式】迭代器模式模式—什么是迭代器模式?
  8. 在OpenCV里图像数据与一维数组转换
  9. Java之下载相关网页到本地
  10. 十大经典零食,你吃过几样?