Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php中的全局变量、对象和引用-它们是如何工作的?_Php_Oop_Global Variables_Pass By Reference - Fatal编程技术网

php中的全局变量、对象和引用-它们是如何工作的?

php中的全局变量、对象和引用-它们是如何工作的?,php,oop,global-variables,pass-by-reference,Php,Oop,Global Variables,Pass By Reference,我理解通过使用“=”对象是通过引用分配的,对于其他变量和数据类型(如字符串和整数),您需要使用“=&”通过引用分配。当通过引用显式使用“=&”指定对象时,它似乎不会影响指定。但是,当您将对象指定给全局对象时,它会这样做 考虑以下几点: <?php $global_obj = null; class my_class { var $value; public function __construct() { global $global_obj;

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

考虑以下几点:

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


谢谢这里发生的是
$global\u obj
是对变量
$this
的引用
$this
是一个伪变量,存在于方法中,作为对当前对象的引用。但是谁知道当它超出方法范围时,
$this
会发生什么呢。参考
$this
可能不是一个好主意

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