使用一些新属性创建对象本身的新副本

时间:2010-06-21 22:02:12

标签: php oop

有时很难用人类语言解释你在编程中想做什么,但我会尝试......

请向我解释,我该如何实现以下逻辑。假设我们有一个模板类:

$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,那么我们就不会创建新的副本。

3 个答案:

答案 0 :(得分:2)

(这里我假设 AddTmpl 函数不返回对象本身的副本。)

以下行错了。您将 AddTmpl 函数的结果保存到$ obj2中,这不会返回 $ obj1 的副本。

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

你必须使用这样的克隆:

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

请注意,在克隆之后,$ obj2和$ obj1完全独立,对一个进行的任何更改都不会反映到另一个。这是预期的目的!

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

修改:修复了代码中的拼写错误

答案 1 :(得分:0)

我不确定你是不是想做什么,但看看php的object cloning

答案 2 :(得分:0)

可能是的,(在addTmpl()函数中使用clone)

但这不值得推荐,你在问题中展示的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();