不同的解释

Del*_*ens 4 php

代码

$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;
Run Code Online (Sandbox Code Playgroud)

回声5,而不是10.

"在第一次检查时,似乎my_class的构造函数在$ global_obj变量中存储了对它自己的引用.因此,当我们稍后将$ global_obj-> my_value的值更改为10时,可以预期相应的值$ a也会改变.不幸的是,new运算符不返回引用,而是返回新创建的对象的副本."

我仍然不明白,所以任何人都可以用不同的方式解释,并帮助我理解?

Pas*_*TIN 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;
Run Code Online (Sandbox Code Playgroud)

给出以下输出:

10
Run Code Online (Sandbox Code Playgroud)


以下是与您的代码的差异:

  • 我删除&之前$this:使用PHP 5,在处理对象时没有必要
  • 我将代码翻译成真正的PHP 5:


作为旁注,您发布的代码应该给您以下警告:

Strict standards: Creating default object from empty value
Run Code Online (Sandbox Code Playgroud)

备注:

  • 我正在使用PHP 5.3.2
  • E_ALL不包括E_STRICT (来源)



经过多次搜索后编辑:

通过PHP手册的References Explained部分,更具体地说,What References Do页面,有一个警告,说(引用):

如果为函数内部声明为global的变量赋值,则该引用仅在函数内部可见.
您可以通过使用$GLOBALS 数组来避免这种情况.

并且有一个例子.


试着$GLOBALS在你的代码中使用,我有这部分代码:

$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;
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

10
Run Code Online (Sandbox Code Playgroud)

这似乎工作;-)


如果我用__construct这个替换方法:

public function __construct()
{
    global $global_obj;
    $global_obj = & $this;
}
Run Code Online (Sandbox Code Playgroud)

它不起作用......


所以看来你不应该global在这里使用,但是$GLOBALS.

手册中给出的解释是:

想想global $var;作为捷径$var =& $GLOBALS['var'];.
因此,分配另一个引用$var只会更改局部变量的引用.



并且,就这样说:使用全局变量通常不是一个好主意 - 而且,在这种特定情况下,感觉这是一个非常糟糕的主意......

(现在,如果这个问题只是为了理解为什么......好吧,我能理解你的好奇心;-))