Un constructeur PHP est une méthode nommée __construct(). PHP l'appelle automatiquement quand vous écrivez new ClassName(...), et les arguments entre les parenthèses deviennent ses paramètres, si bien que l'objet commence sa vie avec ses valeurs déjà définies.
Sans constructeur, vous créeriez un objet vide puis définiriez chaque propriété ensuite, et rien ne vous empêcherait d'en oublier une. Avec un constructeur, new User() sans arguments est une ArgumentCountError.
Promotion des propriétés dans le constructeur
Déclarer une propriété, la lister en paramètre et affecter $this->name = $name répète chaque nom trois fois. Depuis PHP 8.0, un mot-clé de visibilité devant un paramètre du constructeur fait les trois d'un coup :
Un paramètre promu peut aussi être readonly (public readonly string $id), la façon la plus courte d'écrire un objet valeur immuable. Vous pouvez mélanger paramètres promus et paramètres normaux, et le corps du constructeur peut toujours contenir du code qui s'exécute après l'affectation des propriétés promues.
Valeurs par défaut et arguments nommés
Les paramètres du constructeur acceptent des valeurs par défaut comme toute fonction. Les paramètres avec valeur par défaut se placent après les obligatoires. Avec les arguments nommés (PHP 8.0), l'appelant peut aller directement à l'option qu'il veut au lieu de répéter toutes les valeurs par défaut qui la précèdent :
Exécutez-le : la sortie contient du HTML, donc l'onglet Page affiche les trois boutons rendus, et l'onglet Output les balises affichées par PHP. Remarquez les parenthèses dans (new Button('Save'))->render() : depuis PHP 8.4 elles sont facultatives, mais PHP 8.3 en a besoin.
Valider les arguments dans le constructeur
Un constructeur ne peut pas renvoyer false ni un code d'erreur : ce qu'il renvoie est ignoré. Pour refuser une entrée invalide, levez une exception. L'objet n'est alors jamais créé, donc le reste du programme peut se fier à chaque Temperature qu'il reçoit.
La page try catch explique plus en détail comment intercepter ces exceptions.
Plusieurs constructeurs avec des méthodes de fabrique statiques
PHP n'a pas de surcharge de constructeur : une classe, un __construct. Quand un objet peut être construit à partir d'entrées différentes (une date en chaîne, un tableau, un timestamp), ajoutez des méthodes statiques nommées qui préparent les arguments et appellent new static(...). Rendre le constructeur private oblige tout le monde à passer par les fabriques.
new Color(1, 2, 3) depuis l'extérieur de la classe lève désormais une Error (« Call to private Color::__construct() from global scope »). La page static explique pourquoi on utilise ici new static plutôt que new self.
Appeler le constructeur parent avec parent::__construct
Quand une classe enfant définit son propre constructeur, celui du parent ne s'exécute pas tout seul. Appelez-le avec parent::__construct(...), en général en premier, pour que les propriétés du parent soient définies avant que l'enfant ajoute les siennes :
Si l'enfant n'a aucun constructeur, PHP utilise celui du parent, et new Truck('Volvo') passerait ses arguments directement à Vehicle::__construct. Plus de détails dans l'héritage.
Oublier parent::__construct
Cette erreur ne produit aucun message à la ligne où elle se produit. Le constructeur enfant s'exécute, les propriétés typées du parent restent non initialisées, et le programme échoue plus tard, là où a lieu la première lecture :
Ajoutez parent::__construct(); en première ligne de Post::__construct et relancez : la date s'affiche. Une méthode voisine, __destruct(), s'exécute quand la dernière référence à un objet disparaît ou que le script se termine. On en a rarement besoin dans le code courant, car PHP ferme les fichiers et libère la mémoire tout seul à la fin de chaque requête.
Questions fréquentes
Qu'est-ce que __construct en PHP ?
__construct() est le constructeur : une méthode que PHP appelle automatiquement juste après que new a créé l'objet. Les arguments passés à new User('Ada', 36) sont transmis à __construct(string $name, int $age), qui les range en général dans des propriétés.
Qu'est-ce que la promotion des propriétés du constructeur en PHP ?
Depuis PHP 8.0, placer un mot-clé de visibilité sur un paramètre du constructeur déclare la propriété et l'affecte en une seule étape : public function __construct(private string $name) {} revient à déclarer private string $name; et à écrire $this->name = $name; dans le corps.
Une classe PHP peut-elle avoir plusieurs constructeurs ?
Non. PHP n'a pas de surcharge de méthodes, donc une classe a un seul __construct. Utilisez des paramètres facultatifs avec valeurs par défaut, ou ajoutez des méthodes de fabrique statiques comme public static function fromArray(array $data): static qui appellent new static(...) avec les bons arguments.
Le constructeur parent est-il appelé automatiquement en PHP ?
Seulement quand la classe enfant n'a pas de constructeur propre. Si l'enfant définit __construct, le constructeur du parent ne s'exécute pas, sauf si vous appelez vous-même parent::__construct(...), en général en première ligne.
Un constructeur PHP peut-il renvoyer une valeur ?
Non. new vous donne toujours l'objet, et ce que renvoie __construct est ignoré. Pour signaler un problème, levez une exception depuis le constructeur, par exemple throw new InvalidArgumentException('Age must be positive').