不同的解释

时间:2010-04-24 22:38:41

标签: php

代码

$global_obj = null;
class my_class
{
       var $value;
       function my_class()
       {
               global $global_obj;
               $global_obj = &$this;
       }
}
$a = new my_class;
$a->my_value = 5;
$global_obj->my_value = 10;
echo $a->my_value;

回应5,而不是10。

“第一次检查时,似乎my_class的构造函数在$ global_obj变量中存储了对它自己的引用。因此,当我们稍后将$ global_obj-> my_value的值更改为10时,可以预期$ a中的相应值也会发生变化。不幸的是,new运算符不返回引用,而是返回新创建的对象的副本。“

我仍然不理解,所以任何人都可以用不同的方式解释,并帮助我理解?

1 个答案:

答案 0 :(得分:6)

不确定为什么这是它的工作方式,但是,如果您在将&分配给全局变量时删除$this前面的$global_obj = null; class my_class { public $my_value; public function __construct() { global $global_obj; $global_obj = $this; } } $a = new my_class; $a->my_value = 5; $global_obj->my_value = 10; echo $a->my_value; ,它就会起作用。


为了说明这一点,代码的以下部分:

10

提供以下输出:

&


以下是与您的代码的不同之处:

  • 我删除了$this之前的__construct:使用PHP 5,在使用对象时没有必要
  • 我将代码翻译成真正的PHP 5
    • public代表constructor
    • 使用protected / private / var而非Strict standards: Creating default object from empty value 用于properties


作为旁注,您发布的代码应该给您以下警告:

E_ALL

注意:

  • 我正在使用PHP 5.3.2
  • E_STRICT不包括$GLOBALS source



经过多次搜索后编辑:

浏览PHP手册的References Explained部分,更具体地说是What References Do页面,会出现一条警告,上面写着(引用)

  

如果您为a分配引用   变量在a中声明为全局   功能,参考将是   仅在功能内部可见。
您   可以使用$global_obj = null; class my_class { public $my_value; public function __construct() { $GLOBALS['global_obj'] = & $this; } } $a = new my_class; $a->my_value = 5; $global_obj->my_value = 10; echo $a->my_value; 来避免这种情况   阵列。

还有一个例子。


尝试在代码中使用$GLOBALS,我有这部分代码:

10

我得到以下输出:

__construct

这似乎有用; - )


如果我用此替换public function __construct() { global $global_obj; $global_obj = & $this; } 方法:

global

它不起作用......


因此,您似乎不应在此使用$GLOBALS,而是使用global $var;

手册中的解释是:

  

$var =& $GLOBALS['var'];视为一个   $var的快捷方式。
因此分配   仅对{{1}}的另一个引用   改变局部变量   参考



而且,就这样说:使用全局变量通常不是一个好主意 - 而且,在这种特定情况下,感觉这是一个非常糟糕的主意......

(现在,如果这个问题只是为了理解为什么......好吧,我能理解你的好奇心;-))