有关PHP的全局变量问题

walden 发布于 2012/08/13 23:24
阅读 236
收藏 2
PHP
<?php
class c{
 static function d(){
 $a='';
    function a()
        {
            global $a;
            $a=5;
        }
 a();
 var_dump($a);
 }
}
c::d();
?>

为什么结果是空
<?php
    $a='';
    function a() 
        { 
            global $a; 
            $a=5; 
        }

    a();
    var_dump($a); 
?>

结果却是5呢
加载中
0
王昊然
王昊然

第二个不用解释了吧,第一个因为d方法中的$a没有声明global,而a方法中声明了,所以a方法中的$a作用域是全局,而d方法中$a的作用域是d方法内部,所以你在b方法内部dump,会先到当前作用域下去找

<?php
class c{
  static function d(){
    $a='';
    function a(){
      global $a;
      $a=5;
    }
    a();
    var_dump($a);//空
  }
}

c::d();
var_dump($a);//5
?>

walden
walden
回复 @酒逍遥 : 是的
王昊然
王昊然
回复 @华定平 : 不是同一个作用域
酒逍遥
酒逍遥
回复 @华定平 : 你把 d方法中的 a 也声明为 global就可以修改了
walden
walden
a()函数为什么修改不了d()方法中中的$a呢
0
KeepMoving
KeepMoving

说说第一个。

静态方法d里面的$a 不是一个全局的变量。它的作用域在静态方法d里面。所以c::d()返回的只能是d作用域范内的$a,也就是起初赋值的空字符串。后面那个var_dump($a)结果为5就不用说了,在函数a里面已经有个全局的变量$a.所以这里输出全局变量$a的结果。如果你改成这样:

class c{
 static function d(){
 global $a;
 $a = '';
    function a()
        {
            global $a;
            $a=5;
        }
 a();
 var_dump($a);
 }
}
c::d();
var_dump($a);

底下那两个输出的都是5了

walden
walden
但是为什么不在类方法里 函数里用global关键词就可以修改$a的值呢 放到类方法里就不行了呢
0
KeepMoving
KeepMoving

要修改d中的$a 可以用引用。

class c{
 static function d(){
 $a = '';
    function a(&$a)
        {
        	global $a;
            $a=5;
        }
 a($a);
 var_dump($a);
 }
}
c::d();

0
小Leo
小Leo

因为 function(){function(){}} 和 function(){}function(){}是等效的

<?php
class c {
	
	static function d() {
		$a = '';
		a ();
		var_dump ( $a );
	}
	function a() {
		global $a;
		$a = 5;
	}
}
c::d ();

王昊然
王昊然
这代码拿上来之前,你自己运行过吗
小Leo
小Leo
回复 @华定平 : 客气~
walden
walden
回复 @小Leo : 好的 3Q
小Leo
小Leo
回复 @华定平 : 我确定以及肯定
walden
walden
你确定?如果是这样 那问题就容易解释了?这算不算闭包?
返回顶部
顶部