2016-01-26 133 views
1

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

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

感谢您的帮助!

回答

1

你这样做:

$this->LastDados = $this->Dados; 

这意味着$this->LastDados现在是同一个对象。因此,您在$this->Dados中更改的任何内容也将在$this->LastDados之间。

尝试这样做,而不是看会发生什么:

$this->LastDados = clone $this->Dados; 
+0

非常感谢! 我不知道克隆方法。我想我需要学习更多! :) –

+0

除了@ timhysniu的回答。在PHP中,_objects_通过引用**传递并分配**(就像它们链接在一起),而_arrays_则通过值**传递**。当你使用'clone'的时候,你基本上是告诉PHP去掉引用,类似于传递值。你可以尝试看看如果你的对象是数组会发生什么。你会看到你不需要克隆它们。请记住这一点,以便将对象和数组传递给方法/函数。你可以指定一个数组也应该通过引用传递,就像一个对象一样,编写&infront:'$ lastDados =&dados' – Michael

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

+0

我不知道克隆方法。你解释得很好。谢谢! –