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

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

解决方法:

  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. 树状数组(二维):COGS 1532 [IOI2001]移动电话

    1532. [IOI2001]移动电话 ★☆   输入文件:mobilephones.in   输出文件:mobilephones.out   简单对比 时间限制:5 s   内存限制:256 MB ...

  2. loadrunner11有效的license

    下载安装deletelicense.exe先1)退出程序,把下载文件中的lm70.dll和mlr5lprg.dll覆盖掉..\HP\LoadRunner\bin下的这两个文件 2)注意,win7的话一 ...

  3. NOI题库1159 Maze

    1159:Maze 总时间限制: 2000ms 内存限制: 65536kB 描述 Acm, a treasure-explorer, is exploring again. This time he ...

  4. BFS 10.1.5.253 1502

    http://10.1.5.253/acmhome/problemdetail.do?&method=showdetail&id=1502 //1502 #include <st ...

  5. 广度优先搜索BFS

    广度优先搜索可以形成一个广度优先搜索树 算法时间为O(V+E),两重循环 输入:图g,起点start(int) 需要的数据结构:队列Q.color数组(存放每个顶点的颜色) 算法过程: 1. 预处理: ...

  6. 外星人的供给站 (区间覆盖 t贪心)

    /** 区间覆盖问题 分析: 每个点可以确定两个圆心 圆心的范围形成 一个区间 在这个区间上以任意一点画圆便可将此点 包含在内 如果有两个点所确定的区间相交了 说明这两个点可以用一个圆包含在内 即用一 ...

  7. ovs router

  8. Monad

    Monad英文含义,单体.单分子.单细胞. Monad是一种设计模式,表示将一个运算过程,通过函数拆解成互相连接的多个步骤.你只要提供下一步运算所需的函数,整个运算就会自动进行下去.

  9. mysql 字符串类型数字排序

    排序字段+0,类似  Java 把 其他类型转换成字符串 比如 +“”: SELECT    b.tag_value AS NAME,    sum(b.uv) ASVALUE FROM    met ...

  10. [转] 多线程下变量-gcc原子操作 __sync_fetch_and_add等

    http://blog.sina.com.cn/s/blog_6f5b220601013zw3.html 非常好的原子操作,不用加锁:__sync_fetch_and_add GCC 提供的原子操作 ...