Menu
Coddy logo textTech

__clone e clonazione degli oggetti

Fa parte della sezione Programmazione orientata agli oggetti del percorso PHP di Coddy. Lezione 48 di 91.

Quando assegni un oggetto a un'altra variabile in PHP, non ne crei una copia: entrambe le variabili puntano allo stesso oggetto. Per creare una copia effettivamente indipendente, devi usare la parola chiave clone:

<?php
class Product {
    public function __construct(
        public string $name,
        public float $price
    ) {}
}

$original = new Product("Laptop", 999.99);
$copy = clone $original;

$copy->price = 899.99;
echo $original->price . " - " . $copy->price;

Output:

999.99 - 899.99

Per impostazione predefinita, PHP esegue una copia superficiale: copia direttamente tutti i valori delle proprietà. Funziona correttamente per i valori scalari, ma gli oggetti all'interno del tuo oggetto continuano a fare riferimento alla stessa istanza. Il metodo magico __clone() ti consente di personalizzare questo comportamento:

<?php
class Order {
    public function __construct(
        public int $id,
        public array $items = []
    ) {}
    
    public function __clone(): void {
        $this->id = 0;
        $this->items = [];
    }
}

$order1 = new Order(101, ["Book", "Pen"]);
$order2 = clone $order1;

echo "Original: " . $order1->id . ", Clone: " . $order2->id;

Output:

Original: 101, Clone: 0

Il metodo __clone() viene chiamato sul nuovo oggetto dopo aver effettuato la copia superficiale. È qui che puoi reimpostare gli ID, creare nuove copie degli oggetti annidati o eseguire le operazioni di pulizia necessarie affinché il clone sia davvero indipendente.

challenge icon

Sfida

Facile

Creiamo un sistema di versionamento dei documenti che mostra come la clonazione crea copie indipendenti e come il metodo magico __clone() ti permette di personalizzare ciò che accade quando un oggetto viene clonato.

Organizzerai il codice in due file:

  • Document.php: crea una classe Document che rappresenta un documento con versioni. Usa la promozione del costruttore per definire un $title pubblico (stringa), un $content pubblico (stringa) e un $version pubblico (intero, con valore predefinito 1). Aggiungi una proprietà $createdAt privata che memorizza la data e l'ora correnti (usa date('Y-m-d H:i:s') nel costruttore). Il tuo documento deve avere:
    • getCreatedAt(): restituisce la data e l'ora di creazione
    • __clone(): quando un documento viene clonato, la versione deve aumentare di 1 e $createdAt deve essere reimpostato alla data e all'ora correnti (il clone è una nuova versione creata «ora»)
  • main.php: includi il file Document. Riceverai tre input: un titolo, un contenuto e una nuova stringa di contenuto per la versione clonata. Crea un Document con il titolo e il contenuto. Poi clonalo per creare una nuova versione e aggiorna il contenuto del clone con la nuova stringa di contenuto. Stampa quattro righe:
    • La versione del documento originale
    • La versione del documento clonato
    • Il contenuto del documento originale
    • Il contenuto del documento clonato

Questo sistema mostra come __clone() ti permetta di controllare ciò che accade durante la clonazione. Il documento originale conserva la sua versione e la data di creazione, mentre il clone diventa automaticamente una nuova versione con una data e un'ora aggiornate: l'ideale per tenere traccia della cronologia dei documenti, in cui ogni clone rappresenta una nuova revisione.

Provalo tu

<?php

require_once 'Document.php';

// Leggi gli input
$title = trim(fgets(STDIN));
$content = trim(fgets(STDIN));
$newContent = trim(fgets(STDIN));

// TODO: Crea un Document con il titolo e il contenuto

// TODO: Clona il documento per creare una nuova versione

// TODO: Aggiorna il contenuto del clone con la nuova stringa di contenuto

// TODO: Stampa quattro righe:
// 1. La versione del documento originale
// 2. La versione del documento clonato
// 3. Il contenuto del documento originale
// 4. Il contenuto del documento clonato

?>
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore PHP online