clone în PHP

Clase și obiecte PHP 5+ (clone cu proprietăți noi: PHP 8.5+)

Creează o copie a unui obiect. Fără clone, atribuirea unui obiect copiază doar referința către același obiect.

Sintaxă
clone(object $object, array $withProperties = []): object

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 $copie apar și în $obiect, pentru că sunt același obiect.
  • Folosești clone($obj, [...]) din afara clasei pe o proprietate readonly. Proprietățile readonly pot fi scrise doar din interiorul clasei, așa că primești Cannot 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.