Ce este
Șablonul Prototype creează obiecte noi prin clonarea unuia existent, în loc să le construiască de la zero. Pregătești un obiect ca șablon, apoi îl copiezi cu cuvântul-cheie clone din PHP și schimbi doar ce diferă.
Lucrul care trebuie înțeles corect: un clone simplu copiază proprietățile cu valori, dar obiectele din interior sunt partajate, nu copiate. O metodă __clone() le copiază din nou, astfel încât clona devine într-adevăr independentă.
Exemplu: un șablon de document
Șablonul poartă părțile pe care le repetă fiecare document. clone îl copiază — iar __clone() copiază din nou obiectul TagList din interior — așa că editarea copiei lasă șablonul neatins.
Clonează, apoi schimbă diferența
Raportul a primit un titlu nou și o etichetă suplimentară, iar șablonul are în continuare doar [draft] — pentru că __clone() a copiat lista de etichete în loc să o partajeze.
Ieșire: script PHP
<?php
class TagList {
public function __construct(public array $tags) {}
public function add(string $tag): void {
$this->tags[] = $tag;
}
public function show(): string {
return "[" . implode(" ", $this->tags) . "]";
}
}
class Document {
public function __construct(
public string $title,
public string $footer,
public TagList $tags,
) {}
// Un clone simplu ar PARTAJA obiectul TagList — aici îl copiem din nou.
public function __clone(): void {
$this->tags = clone $this->tags;
}
}
$template = new Document("Untitled", "PromptCookbook 2026", new TagList(["draft"]));
$report = clone $template;
$report->title = "Yearly Report";
$report->tags->add("finance");
echo "șablon: ", $template->title, " ", $template->tags->show(), "\n";
echo "clonă: ", $report->title, " ", $report->tags->show(), "\n";
Când să îl folosești
Folosește-l atunci când obiectele noi sunt în mare parte copii ale unuia deja pregătit — documente dintr-un șablon, entități de joc dintr-un generator, date de test dintr-un fixture.
Renunță la el atunci când obiectele se construiesc ieftin de la zero sau nu conțin nimic partajat. Pentru un obiect format din valori simple — șiruri de caractere, numere, tablouri — simplul clone din PHP este deja o copie completă, fără să fie nevoie de __clone().
Avantaje și dezavantaje
Avantaje: creare ieftină a obiectelor preconfigurate; șablonul documentează valorile implicite; nu se repetă codul de configurare.
Dezavantaje: copierea în adâncime se poate greși ușor și subtil — o proprietate-obiect uitată leagă în liniște clona de original; cu timpul, clonele se depărtează de șablon fără să se observe.