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

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

解决方法:

  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. ISAP 模板

    #include <iostream> #include <cstring> #include <cstdio> #include <queue> us ...

  2. Android 子线程请求ASP.NET后台

    首先定义布局文件,及点击事件 public class MainActivity extends Activity { private final int MSG_HELLO = 0; private ...

  3. Implement Trie (Prefix Tree) ——LeetCode

    Implement a trie with insert, search, and startsWith methods. Note:You may assume that all inputs ar ...

  4. Using Apache Web Server with Jboss AS 7

    In real-world projects, it's common to find Apache web server as a front door to your application se ...

  5. maven配置信息查询

    如何在pom.xml配置一个jar相关信息(如groupId,artifactId,version),请参考以下网址(在对应的搜索框中输入jar包名): http://mvnrepository.co ...

  6. python daemon化你的程序

    在之前的树莓派网关项目中遇到了这样一个问题,由于要把网关写的Server持续运行,尤其是要加电自动开启.发现ssh登录开启服务程序之后,当把pty退出时Server端自动断开了,这里想到的APUE中第 ...

  7. NOI2003 文本编辑器

    练手QAQ #include<iostream> #include<algorithm> #include<cstdio> #include<cstdlib& ...

  8. 在线程中进行读取并写入文件和wenjia

    新人求(胸)罩!!! import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException ...

  9. Java并发学习之二——获取和设置线程信息

    本文是学习网络上的文章时的总结,感谢大家无私的分享. Thread类的对象中保存了一些属性信息可以帮助我们辨别每个线程.知道它的一些信息 ID:每一个线程的独特标示: Name:线程的名称: Prio ...

  10. CSDN Markdown简明教程5-高速上手

    0.文件夹 文件夹 前言 CSDN Markdown特点 CSDN Markdown高速上手 1 使用快捷键 粗体斜体 引用 链接 高亮代码块 图片 标题 列表 切割线 撤销反复 2 使用离线写作 3 ...