php中的全局,对象和引用 - 它们如何工作?

时间:2012-02-07 07:07:00

标签: php oop global-variables pass-by-reference

我理解通过使用“=”对象是通过引用分配的,对于其他变量和对于字符串和整数等数据类型,您需要使用“=&”通过引用分配。当您使用“=&”明确地通过引用分配对象时,它似乎不会影响赋值。但是,当您将对象分配给全局时,它会。

请考虑以下事项:

<?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。我的问题是为什么那里的&符号似乎阻止了这种情况发生

由于

1 个答案:

答案 0 :(得分:2)

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

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