GLOBALS区别分析【美高梅游戏官网网站】,GLOBAL
分类:新闻中心

Global,全局变量

还是借用上一篇的例子:

根据官方的解释是

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

PHP代码

1.$GLOBALS['var']是外部的全局变量本身。

 代码如下

PHP hack的使用技巧详解

复制代码 代码如下:

2.global $var是外部$var的同名引用或者指针。

<?php
$a = 1;
$b = 2;
function Sum()
{
global $a, $b; //在里面声明为全局变量
$b = $a + $b;
}
Sum();
echo $b;
?>

代码实现PHP GTK写文本查看器
网站开发中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”;
?>

先看下面的例子:

结果: 3
如果没有全局变量global在方法内是不能获得$a,$b值的,所以在方法里面想用外面的变量就需要先声明这个变量为全局变量,这样就可以使用了

如何正确实现PHP function函数扩展

执行结果为:
0
5
怎么会这样呢?不应该是2个5吗?怎么会出现1个0和1个5呢?

举例说明一下:

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

PHP error_log()函数处理错误日志

恩,我们保留以上问题,深入分析$GLOBALS和global的原理!
我们都知道变量其实是相应物理内存在代码中的”代号”而已
引用php手册的$GLOBALS的解释:
Global 变量:$GLOBALS,注意: $GLOBALS 在 PHP 3.0.0 及以后版本中适用。
由所有已定义全局变量组成的数组。变量名就是该数组的索引。这是一个“superglobal”,或者可以描述为自动全局变量。
也就是说上面代码中的$var1和$GLOBALS['var1']是指的同一变量,而不是2个不同的变量!
下面来分析global到底做了什么?
引用php手册的global的解释:
如果在一个函数内部给一个声明为 global 的变量赋于一个引用,该引用只在函数内部可见。可以通过使用 $GLOBALS 数组避免这一点。
我们都知道php中的函数所产生的变量都是函数的私有变量,那么global关键字产生的变量也肯定逃不出这个规则,为什么这么说呢,看下面的代码:
PHP代码

 

$glpbal $a; $a=123; function f() { echo $a; //错误, }

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

复制代码 代码如下:

 代码如下

再看看下面一例

 代码如下

<?php
// 例子2
function test() {
global $a;
unset($a);
}
$a = 1;
test();
print $a;
?>

    <?php 
    $var1 = 1; 
    $var2 = 2; 
    function test(){ 
         $GLOBALS['var2'] = &$GLOBALS['var1']; 
    } 
    test(); 
    echo $var2; 
    ?> 

 代码如下

复制代码

执行结果为:
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

function f()
{
global $a;
$a=123;
}
f();
echo $a; //正确,可以使用

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

  1. $GLOBALS[]确确实实调用是外部的变量,函数内外会始终保持一致
    可以对照 下面两个列子再加深下印象:
    global:

 代码如下

在用户自定义函数中,一个局部函数范围将被引入。任何用于函数内部的变量按缺省情况将被限制在局部函数范围内(包括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 
    $var1 = 1; 
    $var2 = 2; 
    function test(){ 
         global $var1,$var2; 
         $var2 = &$var1; 
    } 
    test(); 
    echo $var2; 
    ?> 

 代码如下

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

<?php
function myfunction(){
global $bar;
unset($bar);
}
$bar=”someting”;
myfunction();
echo $bar;
?>

 

<?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;
}
?>

 

输出:someting
$GLOBALS[]:

意外打印结果为2

2.优秀的访问器

 代码如下

复制代码 代码如下:

为什么会打印结果为2呢?其实就是因为$var1的引用指向了$var2的引用地址。导致实质的值没有改变

 代码如下

复制代码

<?php
function foo()
{
unset($GLOBALS['bar']);
}
$bar = “something”;
foo();
echo $bar;
?>

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

//A.php 文件
<?php
include 'B.php';
$a =0;
Set_Global($a);
echo $a;
?>
//B.php 文件
<?php
function Set_Global(&$var)
{
    $var=1;
}
?>

$glpbal $a; 
$a=123;  
function f() 

echo $a; //错误, 
}

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

PHP代码

再来看看$GLOBALS[]

再看看下面一例

复制代码 代码如下:

 

 代码如下

 代码如下

<?php
$a = 1;
$b = 2;
function Sum()
{
global $a, $b;
$b = $a + $b;
}
Sum();
echo $b;
?>

 代码如下

$var1 = 1; 
$var2 = 2; 
function test1(){ 
     $GLOBALS['var2'] = &$GLOBALS['var1']; 

test1(); 
echo $var2;  //1

复制代码

输出将是 “3″。在函数中申明 了全局变量 $a 和 $b,任何变量的所有引用变量都会指向到全局变量。
怎么不是2呢,在函数外部不是不影响吗,请注意$b在函数中并没有通过引用修改,而是修改的$b指向物理内存的值,因此外部输入为3。

function test() {
global $a;
unset($a);
}

$var3 = 1; 
$var4 = 2; 
function test2(){ 
     global $var3,$var4; 
     $var4 = &$var3; 

test2(); 
echo $var4;  

function f() 

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

您可能感兴趣的文章:

  • PHP中全局变量global和$GLOBALS[]的区别分析
  • php中global和$GLOBALS[]的分析之一
  • php中$_POST与php://input的区别实例分析
  • php中$_REQUEST、$_POST、$_GET的区别和联系小结
  • php提交表单时判断 if($_POST[submit])与 if(isset($_POST[submit])) 的区别
  • PHP利用超级全局变量$_POST来接收表单数据的实例
  • php中$_GET与$_POST过滤sql注入的方法
  • 用PHP的超级变量$_POST获取HTML表单(HTML Form) 数据
  • PHP中$GLOBALS[''HTTP_RAW_POST_DATA'']和$_POST的区别分析

$a = 1;
test();
print $a;
?>

 //2 为什么$var2的打印结果是1,而$var4的打印结果为2呢?其实就是因为$var3的引用指向了$var4的引用地址。$var4的实际值并没有改变。官方的解释是:$GLOBALS['var']是外部的全局变量本身,global $var是外部$var的同名引用或者指针。

//正确,可以使用

履行效果为:
1

也许这个例子还不是很清晰,我再引入一个例子:

2:PHP Global变量问题解析:

为什么会输出1呢?不是已经把$a给unset了吗?unset失灵了?PHP的bug?
都不是,其实unset起作用了,是把test函数中的$a给unset掉了,可以在函数后面参加
print $a;
也就是说global产生 了test函数外部$a的别名 变量“$a”,为了和外面的$a差别
接着回到上面的例子1,看test_global中的这一代码“$var2 =& $var1;”,上面是一个引用赋值运算,也就是$var2将指向var1所指向的物理内存地址
所以我们得出一个结论,在函数中global和$GLOBALS[]的差别在于:
global在函数产生一个指向函数外部变量的别名变量,而不是真正的函数外部变量,一但转变了别名变量的指向地址,就会产生一些意料不到情况,例如例子1.
$GLOBALS[]确确凿实调用是外部的变量,函数内外会始终维持一致!

 代码如下

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

可以对照 下面两个列子:

$var1 = 1; 
function test1(){ 
     unset($GLOBALS['var1']); 

test1(); 
var_dump($var1);   //NULL

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

 代码如下

$var2 = 1; 
function test2(){ 
    global  $var2; 
     unset($var2); 

test2(); 

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

global:
function myfunction(){
global $bar;
unset($bar);
}
$bar="someting";
myfunction();
echo $bar;
?>
输出:someting
$global[]:
function foo()
{
unset($GLOBALS['bar']);
}
$bar = "something";
foo();
echo $bar;
?>
输出:空

echo $var2;   //1 $var1的值被删除,而$var2的值还存在。这就证明,$var2只是别名引用,本身的值没有受到任何的改变。也就是说global $var其实就是$var = &$GLOBALS['var'],调用外部变量的一个别名而已!

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

PHP 的全局变量和 C 语言有一点点不同,在 C 语言中,全局变量在函数中主动生效,除非被局部变量笼罩。这可能引起一些问题,有些人可能漫不经心的转变一个全局变量。PHP 中全局变量在函数中应用时必须 申明 为全局。
应用 global的例子

answer4:改你的php.ini文件。

 代码如下

设置PHP Global变量 为 on

$a = 1;
$b = 2;

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

function Sum()
{
global $a, $b;

 代码如下

$b = $a + $b;
}

复制代码

Sum();
echo $b;
?>

//A.php 文件

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

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

我们再来看一个例子吧。

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

 代码如下

//B.php 文件

<?php 
    $var1 = 1; 
    function test(){ 
         unset($GLOBALS['var1']); 
    } 
    test(); 
    echo $var1; 
    ?> 

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

因为$var1被删除了,所以什么东西都没有打印。

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

 代码如下

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

<?php 
    $var1 = 1; 
    function test(){ 
        global  $var1; 
         unset($var1); 
    } 
    test(); 
    echo $var1; 
    ?> 

解决方案:

意外的打印了1。证明删除的只是别名|引用,起本身的值没有受到任何的改变。

  1. 冲出局部函数

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文件。

 代码如下

复制代码

//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。

本文由美高梅网址发布于新闻中心,转载请注明出处:GLOBALS区别分析【美高梅游戏官网网站】,GLOBAL

上一篇:没有了 下一篇:PHP可变函数学习小结,可变函数使用小结
猜你喜欢
热门排行
精彩图文