PHP中的简单逻辑

时间:2016-01-26 00:42:26

标签: php arrays object

我正在安静地编程,但我遇到了一个他无法解决的严重问题。我准备了一个简单的脚本来举例说明。我已经避开了这个问题,但想要解释发生了什么。

<?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',但为什么?

感谢您的帮助!

2 个答案:

答案 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文档中找到更多信息:assignmentcloning