Un constructor de PHP es un método llamado __construct(). PHP lo llama automáticamente cuando escribes new ClassName(...), y los argumentos entre paréntesis se convierten en sus parámetros, así que el objeto empieza su vida con sus valores ya asignados.
Sin constructor crearías un objeto vacío y asignarías cada propiedad después, y nada te impediría olvidarte de una. Con un constructor, new User() sin argumentos es un ArgumentCountError.
Promoción de propiedades en el constructor
Declarar una propiedad, ponerla como parámetro y asignar $this->name = $name repite cada nombre tres veces. Desde PHP 8.0, una palabra clave de visibilidad delante de un parámetro del constructor hace las tres cosas a la vez:
Un parámetro promovido también puede ser readonly (public readonly string $id), que es la forma más corta de escribir un objeto de valor inmutable. Puedes mezclar parámetros promovidos y normales, y el cuerpo del constructor puede seguir conteniendo código que se ejecuta después de asignar las propiedades promovidas.
Valores por defecto y argumentos con nombre
Los parámetros del constructor aceptan valores por defecto como cualquier función. Los parámetros con valor por defecto van después de los obligatorios. Con los argumentos con nombre (PHP 8.0), quien llama puede saltar a la opción que quiere en lugar de repetir todos los valores por defecto anteriores:
Ejecútalo: la salida contiene HTML, así que la pestaña Página muestra los tres botones renderizados y la pestaña Salida muestra las etiquetas que imprimió PHP. Fíjate en los paréntesis de (new Button('Save'))->render(): desde PHP 8.4 son opcionales, pero PHP 8.3 los necesita.
Validar los argumentos en el constructor
Un constructor no puede devolver false ni un código de error: lo que devuelva se ignora. Para rechazar una entrada incorrecta, lanza una excepción. Así el objeto nunca llega a crearse, y el resto del programa puede confiar en cada Temperature que recibe.
La página de try catch explica con más detalle cómo capturar estas excepciones.
Varios constructores con métodos factoría estáticos
PHP no tiene sobrecarga de constructores: una clase, un __construct. Cuando un objeto se puede construir a partir de entradas distintas (una cadena de fecha, un array, un timestamp), añade métodos estáticos con nombre que preparen los argumentos y llamen a new static(...). Hacer el constructor private obliga a todo el mundo a pasar por las factorías.
Ahora new Color(1, 2, 3) desde fuera de la clase lanza un Error ("Call to private Color::__construct() from global scope"). La página de static explica por qué aquí se usa new static y no new self.
Llamar al constructor padre con parent::__construct
Cuando una clase hija define su propio constructor, el constructor del padre no se ejecuta por sí solo. Llámalo con parent::__construct(...), normalmente primero, para que las propiedades del padre estén asignadas antes de que la hija añada las suyas:
Si la hija no tiene constructor en absoluto, PHP usa el del padre, y new Truck('Volvo') pasaría sus argumentos directamente a Vehicle::__construct. Hay más sobre esto en herencia.
Olvidar parent::__construct
Este error no produce ningún mensaje en la línea donde ocurre. El constructor hijo se ejecuta, las propiedades tipadas del padre se quedan sin inicializar, y el programa falla más tarde, donde se produzca la primera lectura:
Añade parent::__construct(); como primera línea de Post::__construct y vuelve a ejecutarlo: imprime la fecha. Un método relacionado, __destruct(), se ejecuta cuando desaparece la última referencia a un objeto o cuando termina el script. Rara vez hace falta en el código del día a día, porque PHP cierra los archivos y libera la memoria por sí solo al final de cada petición.
Preguntas frecuentes
¿Qué es __construct en PHP?
__construct() es el constructor: un método que PHP llama automáticamente justo después de que new crea el objeto. Los argumentos que pasas a new User('Ada', 36) se pasan a __construct(string $name, int $age), que normalmente los guarda en propiedades.
¿Qué es la promoción de propiedades en el constructor de PHP?
Desde PHP 8.0, poner una palabra clave de visibilidad en un parámetro del constructor declara la propiedad y la asigna en un solo paso: public function __construct(private string $name) {} equivale a declarar private string $name; y escribir $this->name = $name; en el cuerpo.
¿Una clase de PHP puede tener varios constructores?
No. PHP no tiene sobrecarga de métodos, así que una clase tiene un solo __construct. Usa parámetros opcionales con valores por defecto, o añade métodos factoría estáticos como public static function fromArray(array $data): static que llamen a new static(...) con los argumentos adecuados.
¿Se llama automáticamente al constructor padre en PHP?
Solo cuando la clase hija no tiene constructor propio. Si la hija define __construct, el constructor del padre no se ejecuta salvo que llames tú a parent::__construct(...), normalmente en la primera línea.
¿Un constructor de PHP puede devolver un valor?
No. new siempre te da el objeto, y lo que devuelva __construct se ignora. Para informar de un problema, lanza una excepción desde el constructor, por ejemplo throw new InvalidArgumentException('Age must be positive').