2011-08-03 40 views
5

可能重複:
what is Object Cloning in php?克隆PHP使用範例

我是一種新的以面向對象的開發,我創建一個應用程序作爲一種面向對象的程序,你可以請提供我舉幾個關於如何正常使用PHP的克隆方法的例子,現實生活中的例子是首選。

我想更全面地理解相關的概念。

謝謝,

+2

該文檔從幾個例子開始:http://php.net/manual/en/language.oop5.cloning.php有沒有你不完全明白的東西? – Brad

+0

是不是我不明白手冊說的是什麼,但我沒有看到我的實際水平的任何問題,我想知道在稍後的實施中使用幾個例子。 – Leonardo

回答

14

這裏是一個例子,我需要在前一天克隆一個對象。我需要有兩個DateTime對象,一個from date和一個to date。它們可以在URL參數中指定,但是可以省略其中的任何一個,我需要將它們設置爲默認值。

下面的例子已經被簡化了一些,所以在下面給出的實現中存在缺陷,但它應該給你一個體面的想法。

問題出在DateTime :: modify方法。讓我們假設用戶提供了一個日期從,但是不是一個日期。因此,我們將設置爲日期從給定日期起12個月。

// create the from date from the URL parameters 
$date_from = DateTime::createFromFormat('d/m/Y', $_GET['from']); 

DateTime類的特點是通過一些偏移量來修改自己的方法。所以人們可以假設以下工作。

$date_to = $date_from; 
$date_to->modify('+12 months'); 

但是,這會導致兩個$date_from$date_to是同一日期,即使例子出現在變量$date_from複製到$date_to,它實際上創造了參考到它,而不是一個副本。這意味着當我們調用$date_to->modify('+12 months')時,它實際上修改了兩個變量,因爲它們都指向DateTime對象的同一個實例。

正確的方式做,這將是

$date_to = clone $date_from; // $date_to now contains a clone (copy) of the DateTime instance $date_from 
$date_to->modify('+12 months'); 

克隆語句告訴PHP創建DateTime對象的新實例,並將其存儲在$date_to。從那裏,呼叫修改只會改變$date_to$date_from將保持不變。