PHP中全局变量的使用global和$GLOBALS[]

From: http://blog.csdn.net/happyqyt/article/details/7219889

用PHP开发项目,不可避免的会使用到全局变量,比如一些网站的配置信息,全站通用,那就可以在一个地方设置,然后多个地方调用。

把变量定义为全局变量可以有两种方法:global和$GLOBALS[]。很多人都认为global和$GLOBALS[]只是写法不同而已,其实是有差别的。

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

看一下下面一段PHP代码:

[php] view plaincopyprint?
  1. $a=123;  
  2. function test1(){  
  3.     global $a;  //如果不把$a定义为global变量,函数体内是不能访问$a的   
  4.     echo $a;  //123   
  5. }  
  6. test1();  
  7.   
  8. global $b;  
  9. $b = 456;  
  10. function test2(){  
  11.     var_dump($b);  //NULL   
  12. }  
  13. test2();  
  14.   
  15. function test3(){  
  16.     global $c;  
  17.     $c=789;  
  18. }  
  19. test3();  
  20. echo $c;  //789  
$a=123;
function test1(){global $a;  //如果不把$a定义为global变量,函数体内是不能访问$a的echo $a;  //123
}
test1();global $b;
$b = 456;
function test2(){var_dump($b);  //NULL
}
test2();function test3(){global $c;$c=789;
}
test3();
echo $c;  //789

[php] view plaincopyprint?
  1. $a=123;  
  2. function test1()  
  3. {  
  4. global $a;   //如果不把$a定义为global变量,函数体内是不能访问$a的   
  5. echo $a; //123   
  6. }  
  7. test1();  
  8.   
  9. global $b;  
  10. $b=456;  
  11. function test2()  
  12. {  
  13. var_dump($b);    //NULL   
  14. }  
  15. test2();  
  16.   
  17. function test3()  
  18. {  
  19. global $c;  
  20. $c=789;  
  21. }  
  22. test3();  
  23. echo $c;   //789  
$a=123;
function test1()
{
global $a;   //如果不把$a定义为global变量,函数体内是不能访问$a的
echo $a; //123
}
test1();global $b;
$b=456;
function test2()
{
var_dump($b);    //NULL
}
test2();function test3()
{
global $c;
$c=789;
}
test3();
echo $c;   //789
通过代码得出总结:在函数体内定义的global变量,函数体外可以使用,在函数体外定义的global变量不能在函数体内使用。

再来看看$GLOBALS[]

[php] view plaincopyprint?
  1. $var1=1;  
  2. $var2=2;  
  3. function test1(){  
  4.     $GLOBALS['var2']=&$GLOBALS['var1'];  
  5. }  
  6. test1();  
  7. echo $var2;  //1   
  8.   
  9. $var3=1;  
  10. $var4=2;  
  11. function test2(){  
  12.     global $var3,$var4;  
  13.     $var4=&$var3;  
  14. }  
  15. test2();  
  16. echo $var4;  //2  
$var1=1;
$var2=2;
function test1(){$GLOBALS['var2']=&$GLOBALS['var1'];
}
test1();
echo $var2;  //1$var3=1;
$var4=2;
function test2(){global $var3,$var4;$var4=&$var3;
}
test2();
echo $var4;  //2

[php] view plaincopyprint?
  1. $var1 = 1;    
  2. $var2 = 2;    
  3. function test1(){    
  4.      $GLOBALS['var2'] = &$GLOBALS['var1'];    
  5. }    
  6. test1();    
  7. echo $var2;  //1   
  8.   
  9. $var3 = 1;    
  10. $var4 = 2;    
  11. function test2(){    
  12.      global $var3,$var4;    
  13.      $var4 = &$var3;    
  14. }    
  15. test2();    
  16. echo $var4;   //2  
$var1 = 1;  
$var2 = 2;  
function test1(){  $GLOBALS['var2'] = &$GLOBALS['var1'];  
}  
test1();  
echo $var2;  //1$var3 = 1;  
$var4 = 2;  
function test2(){  global $var3,$var4;  $var4 = &$var3;  
}  
test2();  
echo $var4;   //2
为什么$var2的打印结果是1,而$var4的打印结果为2呢?其实就是因为$var4的引用指向了$var3的引用地址。$var4的实际值并没有改变。官方的解释是:$GLOBALS['var']是外部的全局变量本身,global $var是外部$var的同名引用或者指针。

也许这个例子还不是很清晰,我再引入一个例子:

[php] view plaincopyprint?
  1. $var1 = 1;      
  2. function test1(){      
  3.      unset($GLOBALS['var1']);      
  4. }      
  5. test1();      
  6. var_dump($var1);   //NULL     
  7.   
  8. $var2 = 1;      
  9. function test2(){      
  10.     global  $var2;      
  11.      unset($var2);      
  12. }      
  13. test2();      
  14. echo $var2;   //1   
$var1 = 1;    
function test1(){    unset($GLOBALS['var1']);    
}    
test1();    
var_dump($var1);   //NULL  $var2 = 1;    
function test2(){    global  $var2;    unset($var2);    
}    
test2();    
echo $var2;   //1 
[php] view plaincopyprint?
  1. $var1 = 1;    
  2. function test1(){    
  3.      unset($GLOBALS['var1']);    
  4. }    
  5. test1();    
  6. var_dump($var1);   //NULL   
  7.   
  8. $var2 = 1;    
  9. function test2(){    
  10.     global  $var2;    
  11.      unset($var2);    
  12. }    
  13. test2();    
  14. echo $var2;   //1  
$var1 = 1;  
function test1(){  unset($GLOBALS['var1']);  
}  
test1();  
var_dump($var1);   //NULL$var2 = 1;  
function test2(){  global  $var2;  unset($var2);  
}  
test2();  
echo $var2;   //1

$var1的值被删除,而$var2的值还存在。这就证明,$var2只是别名引用,本身的值没有受到任何的改变。

也就是说global $var其实就是$var = &$GLOBALS['var'],调用外部变量的一个别名而已!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP中常见错误

1、Notice: Undefined variable: 变量名 in 注:使用了一个没有被定义的变量 2、Parse error: syntax error, unexpected T_ELSE in If () { }Else if () { } Echo $test; Else { } 注:是 if else if else 句式错误 3、Parse error: syntax er…

文件I/O和标准I/O的区别

一、先来了解下什么是文件I/O和标准I/O: 文件I/O:文件I/O称之为不带缓存的IO(unbuffered I/O)。不带缓存指的是每个read,write都调用内核中的一个系统调用。也就是一般所说的低级I/O——操作系统提供的基本IO服务,与os…

程序集、应用程序配置及App.config和YourSoft.exe.config .

转自:http://www.cnblogs.com/luminji/archive/2010/10/21/1857339.html 什么是程序集 程序集标识属性 强名称的程序集 强名称工作原理配置文件使用 DEVPATH 查找程序集指定要使用的运行库版本Appconfig和YourSoftexeconfig本章概要: 1:什么是…

用GDB调试程序(一)

GDB概述 ———— GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大…

程序员必须注意的十大编程禁忌

一、不提升非技术技能我们认为非技术技能是项目成功的主要因素。这些非技术技能也可以称之为“软技能”,总体上来说,它已经被公司证明为能够驾驭企业和客户之间的长期商业关系,因此也能决定公司的成长发展路径。一些关键的软技能指标包括&…

Linux 系统应用编程——出错处理(errno)

1. errno变量 文件 <errno.h> 中定义了符号 errno 以及可以赋予它的各种常量,这些常量都是以字符 E 开头。例如,若 errno 等于常量 EACCES,表示产生了权限问题(例如,没有打开所要求文件的足够权限)。 当 UNIX 函数出错时,常常返回一个负值,而且将整型变量 errno 设置…

有关MSHTML

http://msdn.microsoft.com/zh-HK/library/aa741322有关MHTML的接口参考文档转载于:https://blog.51cto.com/amcto111/1284453

[Android]在Dagger 2中使用RxJava来进行异步注入(翻译)

以下内容为原创&#xff0c;欢迎转载&#xff0c;转载请注明 来自天天博客&#xff1a;http://www.cnblogs.com/tiantianbyconan/p/6236646.html 在Dagger 2中使用RxJava来进行异步注入 原文&#xff1a;http://frogermcs.github.io/async-injection-in-dagger-2-with-rxjava 几…

关于Go语言在服务端做Restful接口和socket通信

请到我的个人博客看golang rest相关文章 http://xiaorui.cc关于Go语言在服务端做Restful接口和socket通信已经转到: http://xiaorui.cc/2014/10/25/%E5%85%B3%E4%BA%8Ego%E8%AF%AD%E8%A8%80%E5%9C%A8%E6%9C%8D%E5%8A%A1%E7%AB%AF%E5%81%9Arestful%E6%8E%A5%E5%8F%A3%E5%92%8C…

Linux 系统应用编程——文件I/O

Linux操作系统是基于文件概念的。文件是以字符序列构成的信息载体。根据这一点&#xff0c;可以把I/O设备当做文件来处理&#xff0c;因此&#xff0c;在磁盘上的普通文件进行交互所用的统一系统调用可以直接用于I/O设备。这样大大简化了系统对于不同设备的处理&#xff0c;提高…

Socket模型详解

Socket模型详解 Winsock 的I/O操作&#xff1a;1、两种I/O模式 阻塞模式&#xff1a;执行I/O操作完成前会一直进行等待&#xff0c;不会将控制权交给程序。套接字默认为阻塞模式。可以通过多线程技术进行处理。 非阻塞模式&#xff1a;执行I/O操作时&#xff0c;Winsock函数会…

UVa 11136 - Hoax or what

题目大意&#xff1a;超市进行促销活动&#xff0c;顾客可以把账单放到一个箱子里&#xff0c;每天超市会从箱子中抽出最高消费者和最低消费者&#xff0c;最高消费者可以得到&#xff08;最高消费-最低消费&#xff09;的金钱。询问超市在n天的促销活动结束后应支付多少钱。 找…

静态库和动态库的分析

在Linux操作系统中&#xff0c;普遍使用ELF格式作为可执行程序或者程序生成过程中的中间格式。ELF&#xff08;Executable and Linking Format&#xff0c;可执行连接格式&#xff09;。 ELF文件格式包括三种主要的类型&#xff1a;可执行文件、可重定向文件、共享库&#xff1…

Linux替换命令

:s/^.*$/\L&/100 &#xff03;&#xff03;将100行内的小写转换成大写 vi/vim 中可以使用 :s 命令来替换字符串。 :s/vivian/sky/ 替换当前行第一个 vivian 为 sky :s/vivian/sky/g 替换当前行所有 vivian 为 sky :n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第…

bash中时间、日期操作

From: Linux 使用 date 計算時間(昨天、明天) 偶尔要算算时间&#xff0c;转载一下&#xff0c;不用再去man了 昨天 (前一天) date –date’1 days ago’ “%Y-%m-%d”date -d ’1 days ago’ “%Y-%m-%d”date -d yesterday “%Y-%m-%d” 明天 (後一天) date –date’1 days…

如何用Chrome浏览器下载网页音乐视频

打开网页&#xff0c;先让要下载的视频播放&#xff0c;右键单击选择审查元素&#xff08;F12&#xff09;&#xff0c;选择上方的Network选项&#xff0c;按F5刷新&#xff0c;这个时候我们可以看到框架中Size下的不少文件数据数字正在变大&#xff0c;按size降序排列。点击表…

Linux 系统应用编程——标准I/O

标准I/O的由来 标准I/O指的是ANSI C 中定义的用于I/O操作的一系列函数。 只要操作系统安装了C库&#xff0c;标准I/O函数就可以调用。换句话说&#xff0c;如果程序中使用的是标准I/O函数&#xff0c;那么源代码不需要任何修改就可以在其他操作系统下编译运行&#xff0c;具有更…

GitLab五种权限

From: https://blog.csdn.net/chenguanghan123/article/details/100523824

Winfrom实现圆角设计

主要代码 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Paint(object sender, PaintEventArgs e) { Type(this, 25, 0.1); } private void…

Linux 系统应用编程——进程基础

一、Linux下多任务机制的介绍 Linux有一特性是多任务&#xff0c;多任务处理是指用户可以在同一时间内运行多个应用程序&#xff0c;每个正在执行的应用程序被称为一个任务。 多任务操作系统使用某种调度(shedule)策略&#xff08;由内核来执行&#xff09;支持多个任务并发执行…