全局参数、对象和引用的工作方式


Globals, objects and references in how do they work?

我知道,通过使用"="对象是通过引用分配的,对于其他变量和字符串和整数等数据类型,您需要使用"=&"通过引用分配。当您显式使用"=&"通过引用分配对象时,它似乎不会影响分配。但是,当您将对象指定给全局对象时,它会这样做。

考虑以下内容:

<?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
?>

如果删除上面代码$this中的"与"符号,则通过引用将其分配给$global_obj。我的问题是为什么里面有"与"符号似乎可以阻止这种情况的发生

感谢

这里发生的是$global_obj是对变量$this的引用。$this是一个伪变量,存在于方法内部,作为对当前对象的引用。但是谁知道当$this超出方法范围时会发生什么呢。引用$this可能是个坏主意。

事实上,如果您进一步研究它,在构造函数返回后,如果您检查$global_obj,它的值就是null。PHP引擎可能会在方法退出后将$this设置为null(但这一点在任何地方都没有记录),并且您的$global_obj(因为它是对变量$this的引用)紧随其后。当您在null上设置属性时,它会自动实例化stdClass类的新对象,因此它似乎成功了。当然,这与$a中的对象完全不同。