有时很难用人类语言解释你在编程中想做什么,但我会尝试......
请向我解释,我该如何实现以下逻辑。假设我们有一个模板类:
$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 :(得分: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();