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

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

解决方法:

  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. java一切乱码的解释 以及源头【转】

    工作中经常遇到java编码问题,由于缺乏研究,总是无法给出确切的答案,这个周末在网上查了一些资料,在此做些汇总. 问题一:在java中读取文件时应该采用什么编码? Java读取文件的方式总体可以分为两 ...

  2. bzoj1251 序列终结者(Splay Tree+懒惰标记)

    Description 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这 ...

  3. UVA 11922 Permutation Transformer(Splay Tree)

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18902 [思路] 伸展树+打标记. 用伸展树维护这个序列,使得能 ...

  4. [置顶] Ubuntu 12.04以上如何恢复GNOME传统界面

    Ubuntu 12.04以上开始使用Unity作为界面系统了,对于一直以来使用GNOME界面的人来说太不适应了,以下是如何在Ubuntu 12.04上恢复GNOME桌面 打开Linux终端上输入以下命 ...

  5. LINUX curl GET 掉参数解决办法

    LINUX curl GET 掉参数解决方法 url 为 http://mywebsite.com/index.php?a=1&b=2&c=3web形式下访问url地址,使用 $_GE ...

  6. Angular过滤器 自定义及使用方法

    首先设置自定义过滤器. 定义模块名:angular .module('myApp') .filter('filterName',function(){ return function(要过滤的对象,参 ...

  7. Android 4.4(KitKat)中VSync信号的虚拟化

    原文地址:http://blog.csdn.net/jinzhuojun/article/details/17293325 Android 4.1(Jelly Bean)引入了Vsync(Vertic ...

  8. [转载]Android利用convertView优化ListView性能

    本的getView写法 Java代码public View getView(int position, View convertView, ViewGroup parent) {View view = ...

  9. 阿里云服务器[教程3]一键安装php+mysql+ftp+nginx环境

    直接看地址 http://help.aliyun.com/manual?spm=0.0.0.0.F5PPZs&helpId=129

  10. Android(java)学习笔记222:开发一个多界面的应用程序之不同界面间互相传递数据(短信助手案例的优化:请求码和结果码)

    1.开启界面获取返回值 (1)采用一种特殊的方式开启Activity:               startActivityForResult(intent , 0): (2)在被开启的Activi ...