$_GLOBALS超全局数组和global定义的全局变量区别?
全局变量:主程序中定义的变量(函数外部),只能在主程序中使用,在函数内部不能调用
背景:解决在函数内部调用全局变量的问题

解决方法:
1.在函数内部声名全局变量
<?php
public $var=1;
function fun(){
global $var;
echo $var;
}
?>
输出 1
2.使用$GLOBALS超全局数组
<?php
$var=1;
function fun(){ echo $GLOBALS['var'];
}
fun();
?>
输出 1
原理分析:
$GLOBALS['var']是外部的全局变量本身
global $var是对外部$var的同名变量的引用或者指针,并不是真正的赋值
验证:
<?php
$var1 = 1;
function test(){
global $var1;
unset($var1);
}
test();
echo $var1;
?>
输出1
说明删除的只是函数内部的变量(即对外部变量别名的引用),外部的变量不影响
再如:
<?php
$var1 = 1;
function test(){
unset($GLOBALS['var1']);
}
test();
echo $var1;
?>
无输出
变量不存在 把全局变量给删除了
深入剖析:
<?php
function test_global() {
global $var1, $var2;
$var2 =& $var1; //引用了一个新的指向,所以现在$var2已经不是全局变量,只是函数内部的变量,对外部的全局变量没影响 只有赋值才会改变外部全局 变量的值
echo $var2; 5
}
function test_globals() {
$GLOBALS['var3'] =& $GLOBALS['var1'];
//相当于对原有全局变量一个引用,值会改变
}
$var1 = 5;
$var2 = $var3 = 0;
test_global(); //输出5
print $var2 ."\n"; //输出0
test_globals();
print $var3 ."\n"; //输出5
?> 输出 5 0 5
总结:
1.global $var是对外部$var的同名变量的引用或者指针,且只有赋值才会改变全局变量的值,若为引用($var2 =& $var1;)只适用于函数内部
2.$GLOBALS['var']是外部的全局变量本身,在函数内部可以使用$GLOBALS数组调用
3.作用域:Global的作用是定义全局变量,但是这个全局变量不是应用于整个网站,而是应用于当前页面,包括include或require的所有文件。
$GLOBALS超全局数组适用于任何地方
4.在函数体内定义的global变量,函数体外可以使用,在函数体外定义的global变量不能在函数体内使用,
<?php
$var1 = 5;
function test_global() {
global $vars;
$vars='red'; echo $vars."\n";
} test_global();
echo $vars; ?>
5.可以使用$GLOBALS超全局数组调用系统中的所有变量和常量以及对象和对象中的属性变量值
$GLOBALS['ecs'] => ECS Object $ecs 调用对象
$GLOBALS['_SERVER']=> $_SERVER全局变量数组 调用超全局变量$_SERVER数组
$GLOBALS['ecs']['db_name'] => ECS Object 调用ecs对象里面定义的变量 $db_name
$GLOBALS['ecs']->table('shop_config') ecs对象的table方法() 调用ecs对象里面定义的table函数
随机推荐
- Uncle Sam 山姆大叔
山姆大叔被用来代指“美国”或“美国政府”,主要在美国.英国,尤其是在新闻界中使用较多.“山姆大叔”是美国的绰号,它同自由女神一样,为世人所熟知. 形象 美国的报纸杂志.文学作品和漫画中,经常可以看到“ ...
- @property中有哪些属性关键字?/ @property 后面可以有哪些修饰符?
出题者简介: 孙源(sunnyxx),目前就职于百度 整理者简介:陈奕龙(子循),目前就职于滴滴出行. 转载者:豆电雨(starain)微信:doudianyu 属性可以拥有的特质分为四类: 原子性- ...
- Oracle Locks之DML锁
Oracle通过锁来实现数据库的并发控制 Oracle Database automatically locks a resource on behalf of a transaction to pr ...
- mybatis 关联对象mapper.xml的写法
https://github.com/zfrHJ/mybaties/blob/master/mybaties/src/com/itheima/mybatits/mapper/OrdersMapperC ...
- Core OS 层
Core OS层的底层功能是很多其他技术的构建基础.通常情况下,这些功能不会直接应用于应用程序,而是应用于其他框架.但是,在直接处理安全事务或和某个外设通讯的时候,则必须要应用到该层的框架. Acce ...
- [转载]Android利用convertView优化ListView性能
本的getView写法 Java代码public View getView(int position, View convertView, ViewGroup parent) {View view = ...
- 在Quick-cocos2dx中使用云风pbc解析Protocol Buffers,支持win、mac、ios、android
本例主要介绍 如何将 pbc 集成到quick-cocos2dx框架中,让我们的cocos2dx客户端Lua拥有编解码Protocol Buffers能力. 参考: 云风pbc的用法: http:// ...
- Linux 信号表
信号 取值 默认动作 含义(发出信号的原因) SIGHUP 1 Term 终端的挂断或进程死亡 SIGINT 2 Term 来自键盘的中断信号 SIGQUIT 3 Core 来自键盘的离开信号 SIG ...
- Java笔试题二:读程序
public class SopResult { public static void main(String[] args) { int i = 4; System.out.println(&quo ...
- Java基础知识强化之集合框架笔记13:Collection集合存储学生对象并遍历
1. Collection集合存储学生对象并遍历: 需求:存储自定义对象并遍历Student(name,age) 分析: (1)创建学生类 (2)创建集合对象 (3)创建学生对象 (4)把学生对象添加 ...