---
tags: pdw2020
---
# Uso de parámetros en los constructores
Los constructores pueden o no tener parámetros. Esto depende si la clase almacena datos en su estado, o no.
## ¿Para qué sirven los constructores y cuándo tiene sentido definirle parámetros?
Los constructores sirven para asegurarnos que cuando creemos un objeto, éste esté en un estado válido. Cuando hablamos de "estado válido", nos referimos a que los datos que almacena el objeto son realmente válidos, y no falta ninguno.
Supongamos que definimos la clase persona de la siguiente manera:
```php
<?php
class Persona {
private string $nombre;
private int $edad;
private string $dni;
public function __construct() {
}
}
```
El código anterior es completamente válido, por lo que podríamos hacer lo siguiente:
```php
<?php
$instanciaDeAlfredo = new Persona();
```
Sin embargo, ¿es correcto eso? En ese punto de la ejecución del programa, la `$instanciaDeAlfredo` está incompleta: le faltan todos los datos. ¿Está bien que le falten todos esos datos? ¿O son obligatorios para que el objeto pueda funcionar como es debido?
Si después tuviéramos un método que nos imprime los datos básicos de la persona, como el siguiente:
```php
<?php
class Persona {
private string $nombre;
private int $edad;
private string $dni;
public function __construct() {
}
public function imprimirDatosBasicos() {
echo "Nombre: {$this->nombre} \n" .
"Edad: {$this->edad} \n" .
"DNI: {$this->dni}";
}
}
```
¿Qué pasaría si invocáramos ese método en la `$instanciaDeAlfredo`? Definitivamente lanzaría una excepción diciéndonos que los atributos esos no tienen datos.
Entonces, ¿cómo podemos asegurarnos que siempre que querramos crear un objeto de la clase Persona, tenga los datos básicos cargados? Definiéndolos como parámetro del constructor:
```php
<?php
class Persona {
private string $nombre;
private int $edad;
private string $dni;
public function __construct(
string $nombre,
int $edad,
string $dni
) {
$this->nombre = $nombre;
$this->edad = $edad;
$this->dni = $dni;
}
public function imprimirDatosBasicos() {
echo "Nombre: {$this->nombre} \n" .
"Edad: {$this->edad} \n" .
"DNI: {$this->dni}";
}
}
```
Así, obligamos a todos los que quieran instanciar objetos de la clase Persona, que le pasen esos datos, o PHP lanzará una excepción más coherente: "no se puede instanciar el objeto de la clase Persona, faltan los siguientes parámetros", y listará los parámetros que faltan.
Entonces, retomando el ejemplo de la instancia alfredo:
```php
<?php
$instanciaDeAlfredo = new Persona();
```
Si ahora intentamos hacer eso, PHP lanzará excepción en esa línea, informándonos que no se pudo instanciar la clase persona porque faltan los parámetros. Para que no lance una excepción, deberíamos hacer lo siguiente:
```php
<?php
$instanciaDeAlfredo = new Persona(
'Alfredo',
25,
'1111111111'
);
```
De esta manera, forzamos a todos los que usen la clase Persona a que instancien objetos con un estado válido (en este caso, el estado válido es que los atributos tengan datos, no que estén vacíos).
## Entonces, ¿cuándo el constructor no lleva parámetros?
Cuando la clase no tiene un estado:
```php
<?php
class ClaseSinEstado {
public function __construct() {
}
// Otros métodos
}
```