全局变量:主程序中定义的变量(函数外部),只能在主程序中使用,在函数内部不能调用

    背景:解决在函数内部调用全局变量的问题

解决方法:

  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函数

随机推荐

  1. 【树形动规】HDU 5834 Magic boy Bi Luo with his excited tree

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5834 题目大意: 一棵N个点的有根树,每个节点有价值ci,每条树边有费用di,节点的值只能取一次,边 ...

  2. 保留n位四舍五入小数

    一:可选择保留位数,注释很解释的很详细,上图 二:全部代码 using System; using System.Collections.Generic; using System.Component ...

  3. 控制uwsgi 的信号量

    最近在用nginx+uwsgi+djano搭建一个网站,当.py文件修改后,如果不重启uwsgi,修改无法应用. 查了下uwsgi的相关文档 ,找到几个解决方案.顺便翻译下以备查看 启动服务 Star ...

  4. @property中有哪些属性关键字?/ @property 后面可以有哪些修饰符?

    出题者简介: 孙源(sunnyxx),目前就职于百度 整理者简介:陈奕龙(子循),目前就职于滴滴出行. 转载者:豆电雨(starain)微信:doudianyu 属性可以拥有的特质分为四类: 原子性- ...

  5. 关于STM32 RTC的使用

    直接上代码,很爽. 1.RTC的首次初始化问题 使能时钟:RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE) ...

  6. ScriptManager的使用方法

    脚本管理控件(ScriptManger)是ASP.NET AJAX中很重要的控件,通过使用ScriptManger可以进行整个页面的局部更新的管理.ScriptManger用来处理页面上局部更新,同一 ...

  7. java.util.jar.JarFile cause native heap memory leak

    最近项目中使用了JarFile 这个类 来load jar包中的 configuration,大致的情况如下 public void processJarEntries(JarFile paramJa ...

  8. Note | javascript权威指南[第六版] 第2章:词法结构

      语法结构规定了诸如变量名是什么样的.怎么写注释,以及程序语句之间如何分隔等规则.本章用很短的篇幅来介绍JavaScript的词法结构.   2.1.字符集   JavaScript程序是用Unic ...

  9. [转] 使用memc-nginx和srcache-nginx模块构建高效透明的缓存机制

    为了提高性能,几乎所有互联网应用都有缓存机制,其中Memcache是使用非常广泛的一个分布式缓存系统.众所周知,LAMP是非常经典的Web架构方式,但是随着Nginx的 成熟,越来越多的系统开始转型为 ...

  10. JS获取客户端的窗口大小

    function getClientSize() {    var c = window,    b = document,    a = b.documentElement;    if (c.in ...