2010-06-21 2 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

ответ

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

Edit: Исправлена ​​опечатка в коде

+0

Спасибо, но я нашел, что более красиво класть клонирование внутри класса, например return (clone $ this); а затем у меня есть также метод магии __clone(), чтобы отменить некоторые ненужные свойства для нового клона. – Starmaster

+0

Действительно, полезно иметь метод copy(). – Weboide

0

Я не уверен, что это то, что вы пытаетесь сделать, но посмотрите на php's object cloning.

0

Возможно да, (с клоном функции addTmpl())

Но это еще не целебным, то 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(); 
Смежные вопросы