我理解通过使用“=”对象是通过引用分配的,对于其他变量和对于字符串和整数等数据类型,您需要使用“=&”通过引用分配。当您使用“=&”明确地通过引用分配对象时,它似乎不会影响赋值。但是,当您将对象分配给全局时,它会。
请考虑以下事项:
<?php
$global_obj = null;
class my_class {
var $value;
public function __construct() {
global $global_obj;
$global_obj =& $this;
$GLOBALS['some_var'] = $this;
}
}
$a = new my_class();
$a->my_value = 5;
$global_obj->my_value = 10;
echo 'A: ' . $a->my_value; //5
echo '<br />';
echo 'Global Object: ' . $global_obj->my_value; //10
echo '<br />';
echo 'Globals Array Value: ' . $some_var->my_value; //5
?>
如果您删除上面代码中的&符号,则会通过引用将其分配给$ global_obj。我的问题是为什么那里的&符号似乎阻止了这种情况发生?
由于
答案 0 :(得分:2)
这里发生的事情是$global_obj
是对变量$this
的引用。 $this
是一个伪变量,存在于作为当前对象引用的方法中。但谁知道$this
当它超出方法范围时会发生什么。引用$this
可能是一个坏主意。
事实上,如果你进一步调查它,在构造函数返回后,如果你检查$global_obj
,它的值是null
。方法退出后,PHP引擎可能会将$this
设置为null(但不会在任何地方记录),而$global_obj
,因为它是对变量$this
的引用,所以它跟随它。在null
上设置属性时,它会自动实例化类stdClass
的新对象,因此它似乎成功了。但当然这与$a
中的对象完全不同。