OOP PHP: classi, oggetti, costruttore, distruttore
__construct, __destruct, new, clone, property access
Una classe è un progetto: descrive quali dati (proprietà) e quali comportamenti (metodi) avrà ogni cosa costruita a partire da essa. Un oggetto è una di quelle «cose»: un'istanza concreta della classe, con i suoi valori propri.
La classe è il progetto architettonico di una casa: definisce quante stanze avrà, dove sarà la cucina. L'oggetto è ogni casa realmente costruita da quel progetto, puoi costruirne cento, tutte con la stessa struttura, ma ciascuna con mobili, colori e abitanti diversi.
1. new e __construct: nascere con i dati giusti
La parola chiave new crea un oggetto a partire da una classe. Se la classe definisce un metodo __construct(), PHP lo chiama automaticamente in quel momento: è il posto giusto per inizializzare le proprietà con i valori ricevuti.
class Prodotto
{
public string $nome;
public float $prezzo;
public function __construct(string $nome, float $prezzo)
{
$this->nome = $nome;
$this->prezzo = $prezzo;
}
}
$penna = new Prodotto('Penna', 1.50);
echo $penna->nome; // 'Penna'
Dentro la classe, $this fa sempre riferimento all'oggetto corrente, quello su cui il metodo è stato chiamato, non alla classe in astratto.
2. Property access: leggere e chiamare con ->
L'operatore -> accede a proprietà e metodi di un oggetto, non si usa il punto . come in altri linguaggi, il punto, in PHP, è riservato alla concatenazione di stringhe.
$penna->prezzo; // legge la proprietà
$penna->prezzo = 2.00; // la modifica
$penna->descrivi(); // chiama un metodo
3. __destruct: l'ultimo saluto, quando l'oggetto sparisce
Il metodo __destruct() viene chiamato automaticamente quando non esistono più riferimenti a quell'oggetto, di norma quando il garbage collector di PHP se ne libera, oppure alla fine dello script.
class Connessione
{
public function __construct()
{
echo "Connessione aperta\n";
}
public function __destruct()
{
echo "Connessione chiusa\n";
}
}
function usaConnessione()
{
$c = new Connessione();
// "Connessione aperta"
}
// fine funzione: $c esce di scope -> "Connessione chiusa"
Utile per operazioni di «pulizia», chiudere una connessione, rilasciare una risorsa senza doverle richiamare a mano ogni volta.
4. clone: copiare un oggetto, con un'insidia da conoscere
Assegnare un oggetto a un'altra variabile non lo copia, copia solo il riferimento, come già visto per gli oggetti JavaScript. Per ottenere davvero una copia indipendente serve la parola chiave clone.
$originale = new Prodotto('Penna', 1.50);
$copia = clone $originale;
$copia->prezzo = 3.00;
echo $originale->prezzo;
// 1.50 -- l'originale non è cambiato
Ma il manuale segnala l'insidia: clone fa una copia superficiale se una proprietà è a sua volta un riferimento a un altro oggetto, quel riferimento resta condiviso tra originale e copia. Per intervenire, si definisce un metodo magico __clone(), chiamato automaticamente subito dopo la copia.
class Ordine
{
public Prodotto $prodotto;
// riferimento a un altro oggetto
public function __clone(): void
{
$this->prodotto = clone $this->prodotto;
// copia anche il prodotto
}
}
In sintesi
| Concetto | Cosa fa | Quando entra in gioco |
|---|---|---|
class / new |
Il progetto e le istanze create da esso | Ogni volta che serve un nuovo oggetto |
__construct() |
Inizializza le proprietà alla creazione | Chiamato automaticamente da new |
__destruct() |
Pulizia quando l'oggetto sparisce | Automatico, a fine scope o script |
-> |
Accede a proprietà e metodi | Mai il punto: quello è per le stringhe |
clone |
Copia indipendente (ma superficiale) | Gli oggetti annidati restano condivisi |
Questi cinque concetti bastano per capire qualsiasi classe PHP che incontrerai, dalle più semplici ai framework più complessi.
Commenti (0)
Registrati per commentare, fare domande e proporre l'argomento della prossima pillola (oppure accedi se hai già un account).
Nessun commento. Sii il primo a scrivere qualcosa.