PHP no soporta sobrecarga de constructores de manera nativa, pero podríamos imitar la sobrecarga analizando los parámetros enviados a la función, permitiendo sobrecargar dependiendo del número de parámetros.
La Programación Orientada a Objetos (POO) en PHP tiene una carencia que considero fundamental y quien venga de otros lenguajes la echará seriamente en falta. Se trata de la sobrecarga de métodos, que es uno de los pilares fundamentales que hace de la POO una gran forma de crear software más versátil y que reutilice más código.
El motivo de la ausencia de la sobrecarga es debido a que PHP es un lenguaje levemente tipado, o de tipado dinámico, por lo que le falta la herramienta fundamental para implementar la sobrecarga típica de otros lenguajes.
En este artículo estudiaremos una alternativa muy sencilla, pero totalmente funcional para poder simular la sobrecarga de métodos, de modo que aprovechemos sus posibilidades tal como si fuera algo nativamente soportado por PHP. En concreto, encararemos el problema con los métodos constructores, de modo que podamos construir objetos con distintos juegos de parámetros.
¿Por qué no hay sobrecarga de métodos en PHP?
Al notar la falta de sobrecarga de métodos en la Programación Orientada a Objetos implementada en PHP, uno se puede quedar pensando ¿por qué no existe en PHP? ¿no se trata de una POO devaluada debido a la carencia de sobrecarga? ¿cómo puedo hacer clases que tengan constructores que acepten varios juegos de parámetros?
Después de analizar la situación, podemos observar que en PHP sufrimos la carencia de sobrecarga debido a que es un lenguaje poco estricto. En el caso de las funciones, PHP tiene la particularidad de permitir invocarlas enviando un juego de parámetros diferente al que fue declarada. Sin invocamos una función sin enviarle todos los parámetros, PHP dará mensajes de advertencia, pero el código se ejecuta. Si al invocar una función enviamos más parámetros de los que tocaba, ni siquiera nos da un mensaje de advertencia.
Es por ello que no pueden coexistir funciones con el mismo nombre y distintos juegos de parámetros, porque PHP siempre va a utilizar la función que se declare (una única vez), enviando los parámetros de que disponga en el momento se su invocación.
¿Cómo simular la sobrecarga de métodos constructores?
La salida que nos queda para aprovechar las posibilidades de la sobrecarga de métodos es programarla "a mano". Se trata de un proceso sencillo de incorporar, aunque no cabe duda de que es más bonito cuando está admitido por el lenguaje de manera nativa.
El truco está en tener un método "genérico" que no recibe parámetros y un método específico para cada número de parámetros que pensemos aceptar. El método "genérico" lo declaramos sin indicar ningún parámetro y dentro de su código utilizar la función de PHP func_get_args(), que nos permite de manera genérica extraer todos los parámetros que pueda estar recibiendo la función. Una vez sabemos el número de parámetros que nos han enviado en tiempo de ejecución, podemos invocar a la función específica que tiene el código a ejecutar cuando se recibe ese número concreto de parámetros.
Viendo el código del siguiente ejemplo y leyendo sus comentarios podremos entender mejor esta técnica.
class Jugador
{
private $nombre;
private $equipo;
function __construct()
{
//obtengo un array con los parámetros enviados a la función
$params = func_get_args();
//saco el número de parámetros que estoy recibiendo
$num_params = func_num_args();
//cada constructor de un número dado de parámtros tendrá un nombre de función
//atendiendo al siguiente modelo __construct1() __construct2()...
$funcion_constructor ='__construct'.$num_params;
//compruebo si hay un constructor con ese número de parámetros
if (method_exists($this,$funcion_constructor)) {
//si existía esa función, la invoco, reenviando los parámetros que recibí en el constructor original
call_user_func_array(array($this,$funcion_constructor),$params);
}
}
//ahora declaro una serie de métodos constructores que aceptan diversos números de parámetros
function __construct0()
{
$this->__construct1("Anónimo");
}
function __construct1($nombre)
{
$this->__construct2($nombre, "Sin equipo");
}
function __construct2($nombre, $equipo)
{
$this->nombre = $nombre;
$this->equipo = $equipo;
}
}
Podrían existir otros mecanismos para obtener sobrecarga de constructores en PHP, pero éste que hemos visto creo que es el más limpio y el que mejor respeta la filosofía de la Programación Orientada a Objetos.
No obstante, recuerda que esto no es más que un truquillo para imitar la sobrecarga, si es que la necesitas. Pero a veces simplemente tienes que conocer las carencias de tu lenguaje y resolver las cosas de otras formas, por ejemplo teniendo un constructor sin parámetros y métodos para inicializar los objetos que permitan vías de inicialización distintas en las que les envías juegos de parámetros distintos.
Miguel Angel Alvarez
Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...