lunes, 13 de abril de 2009

Sobrecarga de funciones en PHP 4

De entrada, la sobrecarga de funciones no se encuentra entre las posibilidades de PHP, aunque hay algunas formas de simularlo a partir de PHP 5. En versiones anteriores también podemos conseguir un efecto parecido utilizando las funciones de PHP que nos permiten manejar el número de argumentos de la función que quisieramos sobrecargar. Una forma de sobrecargar una función sería la siguiente:
function mifuncion($param1, $param2 = "val2", $param3 = "val3"){
...
}
function mifuncion($param1){
...
}

En el primer caso preparamos la función para ser llamada con varios parámetros, con una serie de valores por defecto, y en el segundo sólo le pasamos un parámeto, obligatorio, que sería un array con toda la información necesaria para la ejecución de la función. Pero como sabemos PHP leerá esto como la redeclaración de mifuncion() y nos mostrará un mensaje de error:
Fatal error: Cannot redeclare mifuncion() (previously declared in ...)

Lo que sí podemos hacer es declarar mifuncion() una sola vez, sin especificar ningún parámetro y programar diferentes comportamientos en función del número y el tipo de argumentos utilizando las siguientes funciones:
Lo que vamos a hacer en concreto es anteponer al código de nuestra función una detección y procesado de los argumentos, los prepararemos para la ejecución de la función -lo que, entre otras cosas, nos va a permitir sobrecargar funciones ya escritas sin tener que tocar ese código. Lo explicaré sobre el código de "sobrecarga" de la función anterior (donde, recordemos, queriamos pasar los datos bien por parámetros, bien como array, y poder tener una serie de valores por defecto):
function mifuncnion(){

//Declaramos variables con los nombres de los argumentos que queremos utilizar
$param1 = NULL;
$param2 = NULL;
$param3 = NULL;

//Comprobamos el número de argumentos
if (func_num_args() == 0){

//Sin argumentos rompemos la ejecución de la función
return "No has pasado argumentos";

}

else if (func_num_args() == 1){

//Con un solo argumento, comprobamos que este sea un array antes de procesarlo.

if (!is_array(func_get_arg(0))){

//Si no es un array rompemos la ejecución de la función
return "El argumento debe ser un array";

}
else{

//Separamos en variables los parámetros pasados por array, si no se han pasado, se les da su valor por defecto

$args = func_get_args();

$param1 = $args[0]['param1'] ? $args[0]['param1'] : "Valor por defecto para param1";
$param2 = $args[0]['param2'] ? $args[0]['param2'] : "Valor por defecto para param2";
$param3 = $args[0]['param3'] ? $args[0]['param3'] : "Valor por defecto para param3";

}

}
else{

//Con varios argumentos, se procesan en orden, si no se han pasado, se les da su valor por defecto.
$args = func_get_args();

$param1 = $args[0];
$param2 = $args[1] ? $args[1] : "Valor por defecto para param1";
$param3 = $args[2] ? $args[2] : "Valor por defecto para param2";

}

//Resto del código de la función

}

No hay comentarios: