Ce face clone
În PHP, $b = $a; pentru obiecte nu face o copie: ambele variabile arată spre același obiect. Ca să obții un obiect separat, scrii $b = clone $a;.
Copia este „superficială”: proprietățile care conțin alte obiecte arată tot spre aceleași obiecte. Dacă vrei să le copiezi și pe ele, scrii în clasă metoda __clone(), care rulează automat pe copie.
Din PHP 8.5, clone se poate apela și ca funcție, cu un al doilea parametru: proprietățile care trebuie schimbate pe copie, de exemplu clone($comanda, ["status" => "livrata"]).
Parametri
| Parametru | Descriere |
|---|---|
$object |
Obiectul copiat. |
$withProperties |
Opțional (PHP 8.5+). Tablou nume => valoare cu proprietățile modificate pe copie. |
Ce returnează
Un obiect nou, copia celui original.
Exemple
Exemplul 1: Referință sau copie
<?php
class Cos
{
public array $produse = [];
}
$a = new Cos();
$b = $a;
$c = clone $a;
$a->produse[] = "lapte";
echo "Produse în b: " . count($b->produse) . "\n";
echo "Produse în c: " . count($c->produse);
Rezultat
Produse în b: 1
Produse în c: 0
Exemplul 2: Copie în adâncime cu __clone
<?php
class Comanda
{
public function __construct(public DateTime $data)
{
}
public function __clone()
{
$this->data = clone $this->data;
}
}
$prima = new Comanda(new DateTime("2026-10-19"));
$aDoua = clone $prima;
$aDoua->data->modify("+1 day");
echo $prima->data->format("d.m.Y") . "\n";
echo $aDoua->data->format("d.m.Y");
Rezultat
19.10.2026
20.10.2026
Exemplul 3: Copie cu proprietăți noi (PHP 8.5)
<?php
class Comanda
{
public function __construct(public int $id, public string $status = "noua")
{
}
}
$c = new Comanda(1024);
$livrata = clone($c, ["status" => "livrata"]);
echo "$c->id: $c->status\n";
echo "$livrata->id: $livrata->status";
Rezultat
1024: noua
1024: livrata
Greșeli frecvente
- Crezi că
$copie = $obiect;copiază obiectul. Modificările pe$copieapar și în$obiect, pentru că sunt același obiect. - Folosești
clone($obj, [...])din afara clasei pe o proprietatereadonly. Proprietățile readonly pot fi scrise doar din interiorul clasei, așa că primeștiCannot modify protected(set) readonly property. Pune clonarea într-o metodă a clasei.
Comenzi înrudite
class / new / $this: Definește o clasă: un șablon pentru obiecte care au date (proprietăți) și funcții proprii (metode).readonly: O proprietate readonly poate primi valoare o singură dată, apoi nu mai poate fi modificată.__get / __set / __toString / __call / __invoke: Metode cu nume speciale, care încep cu două linii jos, rulate automat de PHP în anumite situații.