Febbraio 11, 2025

Fatal error: __clone method called on non-object in PHP: Cos’è e A Cosa Serve?

Introduzione

Nel mondo della programmazione PHP, uno degli errori che potresti incontrare è il fatal error: “__clone method called on non-object”. Questo errore può sembrare complicato, ma con una comprensione chiara di cosa significhi e come si verifica, puoi risolverlo facilmente.

Spiegazione

Il fatal error “__clone method called on non-object” si verifica quando si tenta di clonare qualcosa che non è un oggetto. In PHP, il metodo __clone() è utilizzato per creare una copia superficiale di un oggetto. Se si tenta di clonare una variabile che non è un oggetto, PHP genera questo errore.

Quando si utilizza

Il metodo __clone() viene utilizzato quando hai bisogno di creare una copia di un oggetto esistente. È utile quando desideri modificare la copia di un oggetto senza alterare l’originale. Tuttavia, è importante assicurarsi che la variabile che stai clonando sia effettivamente un oggetto.

Esempi

Vediamo alcuni esempi di come questo errore può verificarsi e come correggerlo.

Esempio di errore

$notAnObject = null;
$clonedObject = clone $notAnObject; // Questo genererà il fatal error

In questo esempio, stiamo cercando di clonare una variabile che è null, non un oggetto. Questo provoca il fatal error.

Soluzione

class MyClass {
    public $value;
    
    public function __construct($value) {
        $this->value = $value;
    }
}

$myObject = new MyClass(10);
$clonedObject = clone $myObject; // Ora questo funzionerà correttamente

In questo esempio corretto, abbiamo creato un oggetto $myObject della classe MyClass. Quando cloniamo $myObject, non si verifica alcun errore perché stiamo clonando un oggetto reale.

Assicurati sempre che la variabile che stai cercando di clonare sia effettivamente un oggetto. Puoi utilizzare la funzione is_object() per verificare se una variabile è un oggetto prima di eseguire l’operazione di clonazione.

$notAnObject = null;

if (is_object($notAnObject)) {
    $clonedObject = clone $notAnObject;
} else {
    echo "La variabile non è un oggetto, clonazione non eseguita.";
}

Con questo controllo, eviti di provare a clonare qualcosa che non è un oggetto, prevenendo così l’errore fatale.

Giorgio

Sono un Web Developer con oltre 20 anni di esperienza nello sviluppo di applicazioni web complesse. Specializzato in PHP, gestione di database relazionali e non relazionali, e integrazione di API, realizzo soluzioni robuste e scalabili per soddisfare esigenze aziendali e tecniche. Mi occupo di architetture server-side, ottimizzazione delle performance e automazione dei processi.