Funciones (3 de 3) PHP 5

Funciones con número de argumentos variables
Es normal que dependiendo de la situación en la que nos encontramos, variemos el número de parámetros con los cuales llamamos a una función. Hay tres formas de hacer esto en PHP:
  • Definiendo la función con argumentos por defecto. Este método permite hacer llamadas con menos parámetros sin que aparezca un error.
  • Utilizando un array para pasar las variables.
  • Usando las funciones de argumento variable func_num_args( ), func_get_arg( ) y func_get_args( ), ya utilizadas en PHP 4.
Argumentos por defecto
Para definir parámetro de este tipo, se sustituyen las variables por expresiones de asignación. El formato es el siguiente.
<?php
 function nombreFuncion ($argumento1 = valor1, $argumento2 = valor2)
 {
 
 }
?>
De esta forma, al llamar a la función podemos hacerlo con varios parámetros. Si alguno de ellos es obviado, este tomará el valor por defecto de la definición. Por ejemplo si llamamos a la función nombreFuncion( ) únicamente con un parámetro, $argumento1 tendrá el valor que le hayamos indicado, y $argumento2 tendrá el valor por defecto, que en este caso es valor2.

A continuación veremos una función con parámetros por defecto.
<?php
 function estadisticas ($pais, $capital = "No definido", $poblacion = "No definido")
 {
  echo ("El pais $pais cuya capital es $capital tiene $poblacion habitantes");
 }
 
 $pais = "España";
 $capital = "Madrid";
 
 estadisticas($pais, $capital);
?>
Como vemos en el ejemplo, no hemos definido el último argumento y sin embargo el uso de los argumentos por defecto ha hecho que no aparezca ningún error en el programa y que termine de ejecutarse correctamente.

Argumentos mediante un array
Al igual que pasamos una variable como parámetro de una función, podemos utilizar un array. Para verlo mejor, observe el siguiente ejemplo.
<?php
 function estadisticas ($datos)
 {
  $pais = isset($datos['pais']) ? $datos['pais'] : "No definido";
  $capital = isset($datos['capital']) ? $datos['capital'] : "No definido";
  $poblacion = isset($datos['poblacion']) ? $datos['poblacion'] : "No definido";
  
  echo ("El pais $pais cuya capital es $capital tiene $poblacion habitantes");
 }
 
 $datos['pais'] = "España";
 $datos['capital'] = "Madrid";
 
 estadisticas($datos);
?>
La salida del ejemplo es exactamente igual al realizado en la sección Argumentos por defecto, como podemos ver, he utilizado operadores ternarios, que ya expliqué en las entradas sobre operadores, y un array asociativo, que explicaré con mas detalle en posteriores entradas.

La ventaja de este método es que podrá utilizar los argumentos que quiera y en el orden que necesite, sin encasillarse en una forma especial de pasar los datos.

Múltiples argumentos con func_num_args( )
Desde su versión 4, PHP ofrece una serie de funciones que pueden ser utilizadas para recuperar los argumentos.
  • func_num_args( ), devuelve el número de argumentos que recibe la función desde la que es llamada.
  • func_get_arg( ), devuelve uno a uno los argumentos pasados de la siguiente forma: func_get_arg(0), func_get_arg(1), func_get_arg(7).
  • func_get_args( ), devuelve un array con todos los argumentos pasados a la función, con los índices del array empezando desde 0.
Cualquiera de estas funciones devolverá un error si son llamadas desde fuera del entorno de una función, y func_get_arg( ), también devolverá un error si es llamada con un número mas alto que los argumentos que reciben.

La utilización de estas funciones tienen una ventaja a largo plazo, ya que si en el transcurso del programa, se varía la cantidad de argumentos con los que se llama una función, se pueden capturar sin necesidad de cambiar el código de las llamadas, ni el de la definición de la función. En el siguiente ejemplo vemos como funciona ese método:
<?php
 function ciudades()
 {
  $numeroArgumentos = func_num_args();
  $contenedor = "Inicio de la funcion!! <br />";
  
  for($contador = 0; $contador < $numeroArgumentos; $contador++)
  {
   $contenedor .= func_get_arg($contador) . "<br />";
  }
  $contenedor .= "Fin de la funcion!! <br /><br />";
  
  return $contenedor;
 }
 
 echo ciudades();
 echo ciudades("España");
 echo ciudades("Alemania", "Holanda", "Belgica", "Paises bajos");
?>
Como vemos en el ejemplo, la función ciudades( ) puede recibir un número indefinido de argumentos, incluso no recibir ninguno sin que ocurra ningún error.

Utilizar los parámetros como array es el método mas flexible y utilizado en los programas PHP, aunque la utilización de variables o las funciones func_num_args(), pueden ser útiles en determinados casos.

Llamadas por valor
Por defecto, las llamadas a funciones se hacen por valor, esto quiere decir que cuando se le pasan los parámetros a las funciones, estas se copian al entorno de la función y todos los cambios que sufran estas variables en este entorno, no afectarán al programa fuera de la función. Esto lo veremos en el siguiente ejemplo:
<?php
 function potencia($numero, $indice)
 {
  $resultado = $numero;
  for($i = $indice; $i > 1; $i--)
  {
   $resultado *= $numero;
  }
  $numero = $resultado;
  
  return $numero;
 }
 $numero = 2;
 $indice = 3;
 
 echo ("El resultado es: " . potencia($numero, $indice));
    echo ("El resultado es: " . potencia($numero, $indice));
?>
Como podemos ver en el ejemplo, dentro de la función potencia( ), se utiliza como parámetro la variable $numero. El valor de esta se sustituye por el resultado de la operación, siendo esta la variable que se utiliza en el return, a continuación ejecutamos por segunda vez la función  utilizando las mismas variables, pero como podemos ver, el resultado es el mismo, $numero vale 2 e $indice 3.

Esto se debe a que la variable $numero de dentro de la función era tan solo una copia de la original, y todos las modificaciones a las que se someta, son indiferentes para la variable $numero original.

Llamadas por referencia
PHP 5 ofrece actualmente dos caminos diferentes para cambiar sus argumentos, en la llamada a la función y en la definición de la misma.

Las variables pasadas por referencia pueden ser modificadas durante el proceso de una llamada, por que lo que se pasa a la función, no es una copia de la variable, sino la variable en sí misma.

Para realizar esto, debemos utilizar el operador "&" delante de las variables como vemos en el ejemplo, que es el mismo que el anterior, solo que co n llamadas por referencia.
<?php
 function potencia(&$numero, &$indice)
 {
  $resultado = $numero;
  for($i = $indice; $i > 1; $i--)
  {
   $resultado *= $numero;
  }
  $numero = $resultado;
  
  return $numero;
 }
 $numero = 2;
 $indice = 3;
 
 echo ("El resultado es: " . potencia($numero, $indice));
 echo ("El resultado es: " . potencia($numero, $indice));
?>
Como podemos ver, el funcionamiento es el mismo, pero el resultado no. Ya que como en la función se modifica la variable $numero, la segunda llamada a la función se hace con esta variable con el nuevo valor, difiriendo así el resultado de la segunda llamada a la función, del ejemplo anterior.

Referencia a variables
Las referencias pueden utilizarse también fuera de las funciones, en el ámbito de las variables, en el siguiente ejemplo vemos como trabaja el operador "&" con las variables.
<?php
 $nombre = "Alejandro";
 echo "\$nombre -> $nombre <br />";
 $nombreCopia = $nombre;
 echo "\$nombre -> $nombre y \$nombreCopia -> $nombreCopia <br />";
 $nombreCopia = "Francisco";
 echo "\$nombre -> $nombre y \$nombreCopia -> $nombreCopia <br />";
 $nombreReferencia = &$nombre;
 echo "\$nombre -> $nombre y \$nombreReferencia -> $nombreReferencia <br />";
 $nombreReferencia = "Rafael";
 echo "\$nombre -> $nombre y \$nombreReferencia -> $nombreReferencia <br />";
?>
El funcionamiento del ejemplo anterior puede resultar algo lioso, pero es de lo mas sencillo.
$nombreCopia es una copia de la variable $nombre y por mucho que la cambiemos, $nombre permanecerá con el mismo valor. En cambio, la variable $nombreReferencia es un alias de $nombre, por lo tanto todos los cambios que se hagan en cualquiera de las dos variables les afectará por igual.

Funciones variables
Un truco muy útil que se puede hacer en algunos casos con PHP, es utilizar variables para almacenar el nombre de funciones. Si una variable contiene el nombre de una función, únicamente deberá añadir unos paréntesis al final de esta para hacer la llamada correctamente.
<?php
 function saludoManiana()
 {
  echo "Buenos dias";
 }
 function saludoTarde()
 {
  echo "Buenas tardes";
 }
 function saludoNoche()
 {
  echo "Buenas noches";
 } 
 $horario = "Tarde";
 $variableFuncion = "saludo".$horario;
 
 $variableFuncion();
?>
En el ejemplo, tenemos tres funciones que nos saludan según el horario en el que ejecutemos el programa. Este valor se recoge en la variable $horario. Sabiendo que todas las funciones empiezan por "saludo", podemos crear una variable concatenando el fragmento de cadena que no varia nunca "saludo" con la variable $horario. De esta forma tenemos el nombre de la función que para hacer la llamada, tan solo tendremos que, a la variable que almacena el nombre de la función, añadir los paréntesis al final de esta como vemos en el ejemplo.

Comentarios

Entradas populares de este blog

Calcular factorial de un numero en JAVA

Ordenar cualquier array con SORT en JAVA

Modificadores de acceso (public, protected y private) JAVA