2010-06-21 64 views
0

有時很難在你想在編程做人類的語言來解釋,但我會嘗試...創建對象本身的新副本的一些新特性

請向我解釋,我怎麼能實現以下邏輯。假設我們有一個模板類:

$obj1=new Tmpl($somevar1, $somevar2, ...); 
//we then add a new file to template 
//as we don't have any files yet, new object won't created 
$obj1->AddTmpl('file1.tmpl'); 
//we add a second file to template, 
//it will be independent template 
//but all properties from $obj1 must be available 
$obj2=$obj1->AddTmpl('file2.tmpl'); 

$obj1->printTmplFile(); //should output file1.tmpl 
$obj2->printTmplFile(); //should output file2.tmpl 

$obj2->printInitialVars(); 
//will print $somevar1, $somevar2 constructed for $obj1; 
//$obj1 of course must have these variables available also 

因此,它的目的是爲模板的每個新文件創建新對象。每個新對象都應具有爲舊對象建立的所有屬性集。因此,在這種情況下,例如,我們不會每次使用相同的參數調用構造函數。也只有$ obj1可以創建它自己的副本。如果它是第一次調用方法AddTmpl,那麼我們不會創建新的副本。

+0

這就是所謂的克隆。 – Pierreten 2010-06-21 22:15:01

回答

2

(在這裏我假設AddTmpl函數不返回對象本身的副本。)

下面一行是錯誤的。您將AddTmpl函數的結果保存到$ obj2中,但不會返回$ obj1的副本。

$obj2=$obj1->AddTmpl('file2.tmpl'); 

你必須使用克隆這樣的:

$obj2 = clone $obj1; 
$obj2->AddTmpl('file2.tmpl'); 

注意,克隆後,$ OBJ 2和$ OBJ1是完全獨立的和所做的任何更改將不會反映到對方。這是預期的目的!

有關克隆的更多信息:http://php.net/manual/en/language.oop5.cloning.php

編輯:在代碼固定錯字

+0

謝謝,但是我發現把克隆放在類裏面更加漂亮,比如return(clone $ this);然後我也有魔法__clone()方法來取消設置新克隆的一些不必要的屬性。 – Starmaster 2010-06-24 00:12:09

+0

的確,有一個copy()方法是很好的。 – Weboide 2010-06-24 00:43:38

0

可能的是,(與在addTmpl()函數克隆)

但那不是adviseable,該API你在這個問題上顯示的不是直接可以理解的/自發性的。

其他的解決方案是:

$tpl = new Tmpl(); 
$tpl->render('template1.tmpl'); 
$tpl->render('template2.tmpl'); 

或者

$tpl = new Tmpl(); 
$tpl->setTmpl('template1.tmpl'); 

$tpl2 = clone $tpl; 
$tpl2->setTmpl('template2.tmpl'); 

$tpl1->render(); 
$tpl2->render();