我正在安静地编程,但我遇到了一个他无法解决的严重问题。我准备了一个简单的脚本来举例说明。我已经避开了这个问题,但想要解释发生了什么。
<?php class Test{
public $Dados, $LastDados;
public function Test(){
$this->Dados = (object) array();
$this->LastDados = (object) array();
$this->Dados->Latitude = 111;
$this->LastDados->Latitude = 333;
$this->LastDados = $this->Dados;
}
public function Show(){
$this->Dados->Latitude = 222;
echo $this->LastDados->Latitude;
}
}
$C = new Test;
$C->Show();
?>
结果将是'222',但为什么?
感谢您的帮助!
答案 0 :(得分:1)
你这样做:
$this->LastDados = $this->Dados;
表示$this->LastDados
现在是同一个对象。因此,您在$this->Dados
中更改的所有内容也将位于$this->LastDados
。
尝试这样做,看看会发生什么:
$this->LastDados = clone $this->Dados;
答案 1 :(得分:0)
赋值运算符(=)以与变量不同的方式处理对象(在PHP 5中):而不是按值行为进行传统赋值,而对象则是通过引用 ,这意味着我们获得了对象的一种别名。
实际上,这段代码
$var1 = 'One';
$var2 = 'Two';
$var1 = $var2;
$var2 = 'Three';
echo "$var1".PHP_EOL;
echo "$var2".PHP_EOL;
输出:
Two
Three
因为$var1
维持$var2
的上一个值,即使您更改了$var2
的值。
在代码中添加以下行:
$C->LastDados->Latitude = 100;
echo $C->Dados->Latitude.PHP_EOL;
echo $C->LastDados->Latitude.PHP_EOL;
输出:
100
100
因为$C->Dados
和$C->LastDados
实际上是相同的对象实例。
如果您需要对象的副本,则必须使用clone
关键字:
$this->LastDados = clone $this->Dados;
您可以在PHP文档中找到更多信息:assignment,cloning。