代码
$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运算符不返回引用,而是返回新创建的对象的副本."
我仍然不明白,所以任何人都可以用不同的方式解释,并帮助我理解?
不知道为什么这是它的工作方式,但是,如果你在将它分配给你的全局变量时删除&前面$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,在处理对象时没有必要
作为旁注,您发布的代码应该给您以下警告:
Strict standards: Creating default object from empty value
Run Code Online (Sandbox Code Playgroud)
备注:
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只会更改局部变量的引用.
并且,就这样说:使用全局变量通常不是一个好主意 - 而且,在这种特定情况下,感觉这是一个非常糟糕的主意......
(现在,如果这个问题只是为了理解为什么......好吧,我能理解你的好奇心;-))
| 归档时间: |
|
| 查看次数: |
107 次 |
| 最近记录: |