Un costruttore PHP è un metodo chiamato __construct(). PHP lo chiama automaticamente quando scrivi new ClassName(...), e gli argomenti tra le parentesi diventano i suoi parametri, così l'oggetto nasce con i suoi valori già impostati.
Senza un costruttore creeresti un oggetto vuoto e imposteresti ogni proprietà dopo, e nulla ti impedirebbe di dimenticarne una. Con un costruttore, new User() senza argomenti è un ArgumentCountError.
Promozione delle proprietà nel costruttore
Dichiarare una proprietà, elencarla come parametro e assegnare $this->name = $name ripete ogni nome tre volte. Da PHP 8.0, una parola chiave di visibilità davanti a un parametro del costruttore fa tutte e tre le cose insieme:
Un parametro promosso può anche essere readonly (public readonly string $id), il modo più breve di scrivere un oggetto valore immutabile. Puoi mescolare parametri promossi e normali, e il corpo del costruttore può comunque contenere codice eseguito dopo l'assegnazione delle proprietà promosse.
Valori di default e argomenti con nome
I parametri del costruttore accettano default come qualsiasi funzione. I parametri con default vanno dopo quelli obbligatori. Con gli argomenti con nome (PHP 8.0) chi chiama può saltare direttamente all'opzione che vuole invece di ripetere tutti i default che la precedono:
Eseguilo: l'output contiene HTML, quindi la scheda Page mostra i tre pulsanti, e la scheda Output mostra i tag stampati da PHP. Nota le parentesi in (new Button('Save'))->render(): da PHP 8.4 sono facoltative, ma PHP 8.3 le richiede.
Validare gli argomenti nel costruttore
Un costruttore non può restituire false o un codice di errore: ciò che restituisce viene ignorato. Per rifiutare un input non valido, lancia un'eccezione. L'oggetto allora non viene mai creato, quindi il resto del programma può fidarsi di ogni Temperature che riceve.
La pagina su try catch spiega più in dettaglio come catturare queste eccezioni.
Più costruttori con metodi factory statici
PHP non ha l'overloading del costruttore: una classe, un __construct. Quando un oggetto si può costruire da input diversi (una stringa di data, un array, un timestamp), aggiungi metodi statici con un nome che preparano gli argomenti e chiamano new static(...). Rendere private il costruttore obbliga tutti a passare per le factory.
new Color(1, 2, 3) dall'esterno della classe ora lancia un Error ("Call to private Color::__construct() from global scope"). La pagina su static spiega perché qui si usa new static invece di new self.
Chiamare il costruttore padre con parent::__construct
Quando una classe figlia definisce il proprio costruttore, quello del padre non viene eseguito da solo. Chiamalo con parent::__construct(...), di solito per primo, così le proprietà del padre vengono impostate prima che la figlia aggiunga le sue:
Se la figlia non ha alcun costruttore, PHP usa quello del padre, e new Truck('Volvo') passerebbe i suoi argomenti direttamente a Vehicle::__construct. Altro su questo in ereditarietà.
Dimenticare parent::__construct
Questo errore non produce alcun errore nella riga in cui avviene. Il costruttore figlio viene eseguito, le proprietà tipizzate del padre restano non inizializzate, e il programma fallisce più tardi, dove avviene la prima lettura:
Aggiungi parent::__construct(); come prima riga di Post::__construct ed eseguilo di nuovo: stampa la data. Un metodo collegato, __destruct(), viene eseguito quando sparisce l'ultimo riferimento a un oggetto o quando lo script termina. Nel codice di tutti i giorni serve raramente, perché PHP chiude i file e libera la memoria da solo alla fine di ogni richiesta.
Domande frequenti
Cos'è __construct in PHP?
__construct() è il costruttore: un metodo che PHP chiama automaticamente subito dopo che new ha creato l'oggetto. Gli argomenti che passi a new User('Ada', 36) vengono passati a __construct(string $name, int $age), che di solito li salva nelle proprietà.
Cos'è la promozione delle proprietà nel costruttore in PHP?
Da PHP 8.0, mettere una parola chiave di visibilità su un parametro del costruttore dichiara la proprietà e la assegna in un solo passo: public function __construct(private string $name) {} equivale a dichiarare private string $name; e scrivere $this->name = $name; nel corpo.
Una classe PHP può avere più costruttori?
No. PHP non ha l'overloading dei metodi, quindi una classe ha un solo __construct. Usa parametri facoltativi con default, oppure aggiungi metodi factory statici come public static function fromArray(array $data): static che chiamano new static(...) con gli argomenti giusti.
Il costruttore della classe padre viene chiamato automaticamente in PHP?
Solo quando la classe figlia non ha un costruttore proprio. Se la figlia definisce __construct, il costruttore del padre non viene eseguito a meno che tu non chiami parent::__construct(...), di solito come prima riga.
Un costruttore PHP può restituire un valore?
No. new ti dà sempre l'oggetto, e ciò che restituisce __construct viene ignorato. Per segnalare un problema, lancia un'eccezione dal costruttore, per esempio throw new InvalidArgumentException('Age must be positive').