PHP Global与$GLOBALS变量作用域与区别

Global,全局变量

  PHP Global变量在实际应用中会发现许多问题需要我们不断的去完善处理。我们在这篇文章中就针对PHP Global变量出现的问题给出了一些具体的解决办法。

PHP hack的使用技巧详解
代码实现PHP GTK写文本查看器
网站开发中PHP语言优缺点
如何正确实现PHP function函数扩展
PHP error_log()函数处理错误日志

1:PHP Global变量的作用是定义全局变量,但是这个全局变量不是应用于整个网站,而是应用于当前页面,包括include或require的所有文件

 代码如下 复制代码

$a=123;
 
function aa()
{
Global $a; 
//如果不把$a定义为global变量
,函数体内是不能访问$a的
echo $a;
}
aa();

总结:

在函数体内定义的PHP Global变量,函数体外可以使用,在函数体外定义的global变量不能在函数体内使用,

 

 代码如下 复制代码
$glpbal $a; 
$a=123;  
function f() 

echo $a; //错误, 
}

再看看下面一例

 代码如下 复制代码

function f() 

global $a;  $a=123; 
}  
f(); 
echo $a;

//正确,可以使用

2:PHP Global变量问题解析:

question:我在config.inc.php中定义了一些变量($a),在别的文件中函数外部 include("config.inc.php"),函数内部需要使用这些变量$a,如果没有声明的话,echo $a是打印不出来任何东西的。因此声明global $a,但是有很多函数和很多变量,总不能不断重复的这样声明吧?有什么好的解决办法,请指点。

answer1:先在config.inc.php里定义常量:define(常量名,常量值),再在其他需要用到的地方require 'config.inc.php',然后就能在这个文件里直接使用这个常量了。

answer2:我也有个办法,就是定义数组,如$x[a],$x,那样就只要声明global $x一个了。

answer3:我试了你的这个方法,不行啊。

answer4:改你的php.ini文件。

设置PHP Global变量 为 on

,下面我们看看复杂点的:

 代码如下 复制代码

//A.php 文件

<?php
function Test_Global()
{
    include 'B.php';
    Test();
}

$a = 0 ;
Test_Global();
echo $a;
?>

//B.php 文件

<?php
function Test()
{
   global $a;//申明函数体Sum内使用的$a变量为global全局变量
   $a =1;
}
?>

为什么输出的却是0?!!

在用户自定义函数中,一个局部函数范围将被引入。任何用于函数内部的变量按缺省情况将被限制在局部函数范围内(包括include 和 require 导入的文件内的变量)!
解释:A.php文件的内Test_Global是定义好的第三方函数,该函数用include导入了B.php文件内的$a的global全局变量,所以$a被限制在Test_Global局部函数范围内,所以B.php文件内的$a的作用范围都在Test_Global内,而不是作用了整个A.php内….

解决方案:
1. 冲出局部函数

 代码如下 复制代码

//A.php 文件

<?php
function Test_Global()
{
    Test();
}
include 'B.php'; //将include 从局部Test_Global函数中移出
$a = 0 ;
Test_Global();
echo $a;
?>

//B.php 文件

<?php
function Test()
{
    global $a;
    $a =1;
}
?>

global和$GLOBALS的区别

php中global和$GLOBALS不仅仅是写法不一样以为,2者的区别还是很大的,在实际应用中需要注意!

先看下面的例子:

PHP代码

 

 代码如下 复制代码

<?php

 // 例子1

 function test_global() {

   global $var1, $var2;

   $var2 =& $var1;

 }

 function test_globals() {

   $GLOBALS['var3'] =& $GLOBALS['var1'];

 }

 $var1 = 5;

 $var2 = $var3 = 0;

 test_global();

 print $var2 .”n”;

 test_globals();

 print $var3 .”n”;

 ?> 

执行结果为:

0

5

怎么会这样呢?不应该是2个5吗?怎么会出现1个0和1个5呢?

恩,我们保留以上问题,深入分析$GLOBALS和global的原理!

我们都知道变量其实是相应物理内存在代码中的”代号”而已

引用php手册的$GLOBALS的解释:

Global 变量:$GLOBALS,注意: $GLOBALS 在 PHP 3.0.0 及以后版本中适用。

由所有已定义全局变量组成的数组。变量名就是该数组的索引。这是一个“superglobal”,或者可以描述为自动全局变量。

也就是说上面代码中的$var1和$GLOBALS['var1']是指的同一变量,而不是2个不同的变量!

下面来分析global到底做了什么?

引用php手册的global的解释:

如果在一个函数内部给一个声明为 global 的变量赋于一个引用,该引用只在函数内部可见。可以通过使用 $GLOBALS 数组避免这一点。

我们都知道php中的函数所产生的变量都是函数的私有变量,那么global关键字产生的变量也肯定逃不出这个规则,为什么这么说呢,看下面的代码:

PHP代码

 

 代码如下 复制代码

<?php

 // 例子2

 function test() {

   global $a;

   unset($a);

 }

 $a = 1;

 test();

 print $a;

 ?> 

执行结果为:

1

为什么会输出1呢?不是已经把$a给unset了吗?unset失灵了?php的bug?

都不是,其实unset起作用了,是把test函数中的$a给unset掉了,可以在函数test()中加入

print $a;

来测试!

接着回到上面的例子1,看test_global中的这一代码“$var2 =& $var1;”,上面是一个引用赋值运算,也就是$var2将指向var1所指向的物理内存地址,所以例子1执行过test_global函数以后,变量的变化只在函数的局部产生效应,在函数外部$var2的指向物理内存地址并没有变化,还是它自己.

此时,就能理解为什么例子1执行完以后,$var2是0,而$var3是5了!

所以我们得出一个结论,在函数中global和$GLOBALS[]的区别在于:

global在函数产生一个指向函数外部变量的别名变量,而不是真正的函数外部变量,一但改变了别名变量的指向地址,就会发生一些意料不到情况,例如例子 1.

$GLOBALS[]确确实实调用是外部的变量,函数内外会始终保持一致

可以对照 下面两个列子再加深下印象:

global:

 代码如下 复制代码

<?php

function myfunction(){

    global $bar;

    unset($bar);

}

$bar=”someting”;

myfunction();

echo $bar;

?>

输出:someting

$GLOBALS[]:

<?php

    function foo()

{

    unset($GLOBALS['bar']);

}

$bar = “something”;

foo();

echo $bar;

?>

输出:空

当按照上面的思路理解后,碰到下面的情况是不是又有些晕呢?

 代码如下 复制代码

<?php

$a = 1;

$b = 2;

function Sum()

{

   global $a, $b;

   $b = $a + $b;

}

Sum();

echo $b;

?>

输出将是 “3″。在函数中申明 了全局变量 $a 和 $b,任何变量的所有引用变量都会指向到全局变量。

怎么不是2呢,在函数外部不是不影响吗,请注意$b在函数中并没有通过引用修改,而是修改的$b指向物理内存的值,因此外部输入为3。

php中global和$GLOBALS不仅仅是写法不一样以为,2者的区别还是很大的,在实际应用中需要注意!

先看下面的例子:

PHP代码

 

 代码如下 复制代码

<?php 

 // 例子1 

 function test_global() { 

   global $var1, $var2; 

   $var2 =& $var1; 

 } 

 function test_globals() { 

   $GLOBALS['var3'] =& $GLOBALS['var1']; 

 } 

 $var1 = 5; 

 $var2 = $var3 = 0; 

 test_global(); 

 print $var2 .”n”; 

 test_globals(); 

 print $var3 .”n”; 

 ?>  

 

执行结果为:

0

5

怎么会这样呢?不应该是2个5吗?怎么会出现1个0和1个5呢?

恩,我们保留以上问题,深入分析$GLOBALS和global的原理!

我们都知道变量其实是相应物理内存在代码中的“代号“而已

引用php手册的$GLOBALS的解释:

Global 变量:$GLOBALS,注意: $GLOBALS 在 PHP 3.0.0 及以后版本中适用。

由所有已定义全局变量组成的数组。变量名就是该数组的索引。这是一个“superglobal”,或者可以描述为自动全局变量。

也就是说上面代码中的$var1和$GLOBALS['var1']是指的同一变量,而不是2个不同的变量!

 

下面来分析global到底做了什么?

引用php手册的global的解释:

如果在一个函数内部给一个声明为 global 的变量赋于一个引用,该引用只在函数内部可见。可以通过使用 $GLOBALS 数组避免这一点。

我们都知道php中的函数所产生的变量都是函数的私有变量,那么global关键字产生的变量也肯定逃不出这个规则,为什么这么说呢,看下面的代码:

PHP代码

 代码如下 复制代码

 <?php 

 // 例子2 

 function test() { 

   global $a; 

   unset($a); 

 } 

  

 $a = 1; 

 test(); 

 print $a; 

 ?>  

 

执行结果为:

1

为什么会输出1呢?不是已经把$a给unset了吗?unset失灵了?php的bug?

都不是,其实unset起作用了,是把test函数中的$a给unset掉了,可以在函数test()中加入

print $a;

来测试!

 

接着回到上面的例子1,看test_global中的这一代码“$var2 =& $var1;”,上面是一个引用赋值运算,也就是$var2将指向var1所指向的物理内存地址,所以例子1执行过test_global函数以后,变量的变化只在函数的局部产生效应,在函数外部$var2的指向物理内存地址并没有变化,还是它自己.

此时,就能理解为什么例子1执行完以后,$var2是0,而$var3是5了!

 

所以我们得出一个结论,在函数中global和$GLOBALS[]的区别在于:

global在函数产生一个指向函数外部变量的别名变量,而不是真正的函数外部变量,一但改变了别名变量的指向地址,就会发生一些意料不到情况,例如例子 1.

 

$GLOBALS[]确确实实调用是外部的变量,函数内外会始终保持一致

可以对照 下面两个列子再加深下印象:

global:

 代码如下 复制代码

<?php

function myfunction(){

    global $bar;

    unset($bar);

}

$bar=”someting”;

myfunction();

echo $bar;

?>

输出:someting

 

 代码如下 复制代码

$GLOBALS[]:

<?php

    function foo()

{

    unset($GLOBALS['bar']);

}

$bar = “something”;

foo();

echo $bar;

?>

输出:空

 

当按照上面的思路理解后,碰到下面的情况是不是又有些晕呢?

 代码如下 复制代码

<?php

$a = 1;

$b = 2;

function Sum()

{

   global $a, $b;

   $b = $a + $b;

}

Sum();

echo $b;

?>

输出将是 “3″。在函数中申明 了全局变量 $a 和 $b,任何变量的所有引用变量都会指向到全局变量。

怎么不是2呢,在函数外部不是不影响吗,请注意$b在函数中并没有通过引用修改,而是修改的$b指向物理内存的值,因此外部输入为3。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索php
, 数组
, 文件
, 函数
, 变量
代码
php global globals、php global作用域、php变量作用域、php变量的作用域、php中变量的作用域,以便于您获取更多的相关知识。

时间: 2024-09-15 11:51:32

PHP Global与$GLOBALS变量作用域与区别的相关文章

PHP 闭包获取外部变量和global关键字声明变量的区别讲解

最近在学习workerman的时候比较频繁的接触到回调函数,使用中经常会因为worker的使用方式不同,会用这两种不同的方式去调用外部的worker变量,这里就整理一下PHP闭包获取外部变量和global关键字声明变量的区别. 闭包 闭包是一个常见的概念,我们通常可以将其与回调函数配合使用,可以使代码更加简洁易读. 闭包可以 通过拷贝的方式 让函数使用父作用域中的变量.如: $global = 'hello'; $bbb = function()use($global){ echo $globa

php中global和$GLOBALS区别分析

根据官方的解释是 1.$GLOBALS['var']是外部的全局变量本身. 2.global $var是外部$var的同名引用或者指针. 先看下面的例子: 举例说明一下:    代码如下 复制代码     <?php      $var1 = 1;      $var2 = 2;      function test(){           $GLOBALS['var2'] = &$GLOBALS['var1'];      }      test();      echo $var2; 

浅谈PHP变量作用域以及地址引用问题

 这篇文章主要介绍了PHP变量作用域以及地址引用问题,有需要的朋友可以参考一下 作用域的概念:   在PHP脚本的任何位置都可以声明变量,但是,声明变量的位置会大大影响访问变量的范围.这个可以访问的范围称为作用域.   主要的常用的包括:局部变量.全局变量.静态变量.   1.局部变量:就是在函数内声明的变量,他保存在内存的栈内,所以访问速度很快.仅在函数内有效.   2.全局变量:与局部变量相反,全局变量可以在程序的任何地方访问.只要在变量前面加关键字GLOBAL,就可以将其识别为全局变量.在

Python基本语法_变量作用域LEGB

目录 目录 软件系统 变量的作用域 高级语言对数据类型的使用过程 作用域的产生 作用域的类型 Llocal局部作用域 Eenclosing嵌套作用域 Gglobal全局作用域 Bbuilt-in内置作用域 变量名解析LEGB法则 实例说明 对变量的引用 对变量的修改 global关键字 nonlocal关键字 命名空间和作用域的区别 软件系统 系统 Ubuntu 14.04 软件 Python 2.7.3 IPython 4.0.0 变量的作用域 在Python程序中创建.改变.查找变量名时,都

php中global和$GLOBALS[]的分析之一_php技巧

这可能引起一些问题,有些人可能漫不经心的改变一个全局变量.PHP 中全局变量在函数中使用时必须申明为全局(注意,Global这个关键字在函数中定义才有用). 1:Global的作用是定义全局变量,但是这个全局变量不是应用于整个网站,而是应用于当前页面,包括include或require的所有文件. 复制代码 代码如下: <?PHP $a=123; function aa() { Global $a; //如果不把$a定义为global变量,函数体内是不能访问函数体外部的$a的,但是可以定义一个相

php变量作用域的深入解析_php实例

PHP 中的每个变量都有一个针对它的作用域,它是指可以在其中访问变量(从而访问它的值)的一个领域.对于初学者来说,变量的作用域是它们所驻留的页面.因此,如果你定义了 $var,页面余下部分就可以访问 $var,但是,其它页面一般不能访问它(除非使用特殊的变量). 因为包含文件像它们是原始(包含)脚本的一部分那样工作,所以在 include() 那一行之前定义的变量可供包含文件使用.此外,包含文件内定义的变量可供 include() 那一行之后的父(包含)脚本使用. 当使用你自己定义的函数时,所有

python 变量作用域详细介绍

 在python中,变量查找遵循LGB原则,即优先在局部作用域(local scope)中对变量进行查找,失败则在全局作用域(global scope)中进行查找,最后尝试再内建作用域(build-in scope)内查找,如果还是未找到的话,则抛出异常.后来由于闭包和嵌套函数的出现,作用域又增加了外部作用域,这样变量的查找作用域优先级变为:局部.外部.全局和内建. 作用域由def.class.lambda等语句产生,if.try.for等语句并不会产生新的作用域.我们看下面的一个例子:  代码

php 变量作用域学习笔记分享

在php当中变量的作用范围php手册上是这样描述的 在用户自定义函数中,一个局部函数范围将被引入.任何用于函数内部的变量按缺省情况将被限制在局部函数范围内.例如:  代码如下 复制代码 <?php $a = 1; /* global scope */ function Test() {    echo $a; /* reference to local scope variable */ } Test(); ?> 这个脚本不会有任何输出,因为 echo 语句引用了一个局部版本的变量 $a,而且

浅析php变量作用域的一些问题_php技巧

昨晚就与到这么一个问题,是全局变量在函数中的问题.今天搜索了一下,发现一篇相当不错的文章,讲了php中的变量作用域.是一位网友翻译的在这贴一下: 变量范围变量的范围即它定义的上下文背景(译者:说白了,也就是它的生效范围).大部分的 PHP 变量只有一个单独的范围.这个单独的范围跨度同样包含了 include 和 require 引入的文件.范例: 复制代码 代码如下: <?php$a = 1;include "b.inc";?>  这里变量 $a 将会在包含文件 b.inc