Otro concepto importante de la orientación a objetos es la sobrecarga de funciones. En lenguajes que no permiten la sobrecarga debemos definir dos métodos distintos (con nombre distinto) para poder trabajar con dos funciones que hacen lo mismo, pero reciben distintos tipos de datos. La sobrecarga es muy importante para el constructor ya que normalmente tendremos distintas formas de crear la clase.
En PHP no existen las sobrecargas como tal. Sin embargo, existen mecanismos para imitarla. Como ya he dicho, la sobrecarga es muy importante en el caso del constructor, así que haremos el ejemplo siguiente, sobrecargando esta función.
El mecanismo que seguimos para imitar a la sobrecarga es usar los atributos opcionales. Imaginad que queremos tener dos constructores distintos:
- Usuario(id, nombre, apellidos, códigoPostal): Recibe los cuatro valores y los inicializa.
- Usuario(nombre, apellidos, códigoPostal): Recibe los tres valores, los inicializa y el identificador también lo inicializa pero de forma aleatoria (o viendo cuál le corresponde si trabajáramos con una base de datos).
La implementación, sería tal como indicamos a continuación (tenemos que poner el parámetro $id al final para poder jugar con los atributos opcionales):
function __construct($nombre, $apellidos, $codigoPostal, $id = 0)
{
if($id != 0)
{
$this->id = $id;
$this->nombre = $nombre;
$this->apellidos = $apellidos;
$this->codigoPostal = $codigoPostal;
}
else
{
$this->id = rand(0,100);
$this->nombre = $nombre;
$this->apellidos = $apellidos;
$this->codigoPostal = $codigoPostal;
}
}
Al poner el identificador al final, igualado a cero en la declaración, lo que le estamos diciendo al compilador es que:
- Si se llama con tres argumentos, el valor del identificador lo iguale a cero y por lo tanto entre en la parte inferior de la condición, donde se calcula el identificador aleatorio.
- Si se llama con cuatro argumentos, el identificador tomará el valor que el usuario le pase y por lo tanto funcionará como lo ha hecho hasta ahora.Veamos un par de ejemplos de invocación de este constructor.
$usuario_1 = new Usuario("José", "Gómez Martínez", 14004);
$usuario_2 = new Usuario("José", "Gómez Martínez", 14004, 10); read more