4
回答
有关PHP的全局变量问题
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   
<?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呢
PHP
举报
walden
发帖于5年前 4回/225阅
共有4个答案 最后回答: 5年前

第二个不用解释了吧,第一个因为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
?>

--- 共有 4 条评论 ---
walden回复 @酒逍遥 : 是的 5年前 回复
王昊然回复 @华定平 : 不是同一个作用域 5年前 回复
酒逍遥回复 @华定平 : 你把 d方法中的 a 也声明为 global就可以修改了 5年前 回复
waldena()函数为什么修改不了d()方法中中的$a呢 5年前 回复

说说第一个。

静态方法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了

--- 共有 1 条评论 ---
walden但是为什么不在类方法里 函数里用global关键词就可以修改$a的值呢 放到类方法里就不行了呢 5年前 回复

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

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

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

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

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