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

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

解决方法:

  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. Unity Dx9 Occlusion Query plugin

    //Occlusion Unity plugin #include "UnityPluginInterface.h" #include <math.h>#include ...

  2. Java中对象的深复制和浅复制详解

    1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵ ...

  3. How many - HDU 2609 (trie+最小表示)

    题目大意:有 N 个手链,每个手链的最大长度不超过100,求出来最多有多少个不同的手链.   分析:因为手链是可以转动的,所以只要两个手链通过转动达到相同,那么也被认为是一种手链,然而如果每次都循环比 ...

  4. Linux 环境变量 $PATH

    我们知道查阅文件属性的指令 ls 完整文件名为:/bin/ls(这是绝对路径),那为什么可以在任何地方执行/bin/ls 这个指令呢?  为什么在任何目录下输入 ls 就一定可以显示出一些讯息而不会说 ...

  5. Mysql binlog日志解析

    1. 摘要: Mysql日志抽取与解析正如名字所将的那样,分抽取和解析两个部分.这里Mysql日志主要是指binlog日志.二进制日志由配置文件的log-bin选项负责启用,Mysql服务器将在数据根 ...

  6. OpenERP新手易犯错误之res.model

    接触OpenERP的人都感慨资料之少,尤其是XML中,出点错是相当郁闷的.尤其是新手.什么都别说了,有图有真相. 视图中关联模型name="model" ,而动作中name=&qu ...

  7. MySQL用命令行复制表的方法

    mysql中用命令行复制表结构的方法主要有一下几种: 1.只复制表结构到新表 ; 或 CREATE TABLE 新表 LIKE 旧表 ; 注意上面两种方式,前一种方式是不会复制时的主键类型和自增方式是 ...

  8. 全情投入是做好工作的基础——Leo鉴书39

    很多人都有:“内向的人则不擅长社交,只能会活得很封闭”的思想,于是不少内向的朋友要么认为只有扭曲自己的性格变得外向才能在社会上吃得开,才能很爽的行走职场:要么就决定完全封闭自己活在孤独之中,其实以上两 ...

  9. java 从零开始,学习笔记之基础入门<Oracle_基础>(三十三)

    Oracle 数据库基本知识   [训练1] 显示DEPT表的指定字段的查询.               输入并执行查询:               SELECTdeptno,dname FROM ...

  10. 字体图标 icon font

    Icon font icon font 指的是用字体文件代替图片文件,来展示图标.特殊字体等元素的方法. 应用场景: iconfont的优缺点 大小能够自由地变化 颜色能够自由地改动 加入阴影效果 * ...