代码
$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运算符不返回引用,而是返回新创建的对象的副本。“
我仍然不理解,所以任何人都可以用不同的方式解释,并帮助我理解?
答案 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,在使用对象时没有必要public
代表constructor protected
/ private
/ var
而非Strict standards: Creating default object from empty value
用于properties
作为旁注,您发布的代码应该给您以下警告:
E_ALL
注意:
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}}的另一个引用 改变局部变量 参考
而且,就这样说:使用全局变量通常不是一个好主意 - 而且,在这种特定情况下,感觉这是一个非常糟糕的主意......
(现在,如果这个问题只是为了理解为什么......好吧,我能理解你的好奇心;-))