gpt4 book ai didi

php - 不同的解释

转载 作者:可可西里 更新时间:2023-10-31 22:49:32 25 4
gpt4 key购买 nike

代码

$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;

回显 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;

给出以下输出:

10


以下是与您的代码的不同之处:

  • 我删除了 $this 之前的 & :对于 PHP 5,在处理对象时不需要这样做
  • 我将代码翻译成真正的 PHP 5:


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

Strict standards: Creating default object from empty value

注释:

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



经过更多搜索后编辑:

遍历 References Explained PHP 手册的部分,更具体地说是 What References Do页面,有一条警告说 (quoting) :

If you assign a reference to a variable declared global inside a function, the reference will be visible only inside the function.
You can avoid this by using the $GLOBALS array.

还有一个例子。


尝试使用 $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;

我得到以下输出:

10

这似乎有效 ;-)


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

public function __construct()
{
global $global_obj;
$global_obj = & $this;
}

这行不通...


所以看起来你不应该在这里使用 global,而应该使用 $GLOBALS

手册中给出的解释是:

Think about global $var; as a shortcut to $var =&
$GLOBALS['var'];
.
Thus assigning another reference to $var only changes the local variable's reference.



而且,正是如此:使用全局变量通常不是一个好主意——而且,在这种特定情况下,感觉像是一个非常糟糕的主意...

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

关于php - 不同的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2706426/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com