Funciones (2 de 3) PHP 5

Parámetros insuficientes
Si se llama a una función con menos parámetros de los que debe utilizar por definición, aparecerá el siguiente error por defecto por ejemplo si llamamos a la función calcularFactorial( ) sin pasarle ningún parámetros:


El error nos advierte que falta el argumento 1 para la función llamada, y nos muestra la linea desde donde se llamó a la función y también la linea donde esta definida la misma. Lo demás son errores que se generan al no tener valor el parámetro de la función y como vemos el resultado final es erróneo.

Este tipo de error no es crítico y se puede controlar mediante excepciones, como veremos en próximos capítulos. Otro remedio para evitar que aparezca este error es utilizar el operador se supresión de errores "@" justo delante de la llamada a la función como vemos en el ejemplo:
@calcularFactorial();
Esto hará que no se muestren los errores por pantalla, una técnica poco recomendable ya que esto dificulta la correción de posibles fallos.

Parámetros en exceso
Ahora estamos en el caso contrario que en el apartado anterior, el hecho de pasarle a una función mas parámetros de los definidos, no muestra ningún error por pantalla, y la ejecución continua normalmente ya que estos parámetros en exceso son omitidos.

Esta propiedad de PHP 5 le permite crear funciones con una cantidad variable de parámetros de entrada.

Ámbito de las variables
Las variables definidas en un archivo de PHP permanecen declaradas en todo el fichero, menos en las funciones. Las funciones crean un entorno de ejecución donde sólo pueden ver las variables que están dentro de las mismas. Aunque no parece muy lógico, esto nos permite tener variables con el mismo nombre en diferentes funciones. Observado en siguiente ejemplo comprenderemos mejor lo que acabamos de explicar:
<?php
 $cadena = "Variable creada FUERA de la funcion";
 
 function comprobacion()
 {
  if(isset($cadena))
  {
   echo $cadena;
  } 
  else
  {
   $cadena = "Variable creada DENTRO de la funcion";
   echo ($cadena);
  } 
 }
 comprobacion();
?>
Ahora vamos a analizar lo acontecido y la salida del programa anterior.
  • Primero creamos una variables llamada $cadena con un string como valor.
  • Seguidamente creamos una función en la cual se comprueba si la variable $cadena existe, si devuelve true dicha comprobación, se muestra por pantalla el valor, en cambio si devuelve false, se crea una nueva variable con el mismo nombre y finalmente se muestra el valor de la variable $cadena.
  • Al final de programa se llama a la función comparacion(), esta comprueba la existencia de la variable $cadena, el resultado de la evaluación es false, por lo cual se crea una nueva variable con el mismo nombre y se muestra por pantalla.
  • La salida final es: Variable creada DENTRO de la función.
La práctica de crear variables con el mismo nombre en distinto entorno es aceptada en PHP. También existen mecanismos que permiten utilizar variables definidas fuera de funciones dentro de estas, solamente anteponiendo la palabra reservada global delante de la variable definida dentro de la función. Utilizando esta técnica con el ejemplo anterior:
<?php
 $cadena = "Variable creada FUERA de la funcion";
 
 function comprobacion()
 {
  global $cadena;
  if(isset($cadena))
  {
   echo $cadena;
  } 
  else
  {
   $cadena = "Variable creada DENTRO de la funcion";
   echo ($cadena);
  } 
 }
 comprobacion();
?>
En este caso todo el programa transcurre igual que el anterior, solo que al contener la función "global $cadena;", las referencias a la variable $cadena, se harán utilizando la variable $cadena definida en la linea 2. Por ello, el if devuelve true ya que la variable ya se definió, mostrando su valor por pantalla, en este caso la salida es: Variable creada FUERA de la función.

Variables estáticas
Por defecto, las funciones que creamos en PHP 5 no retienen en memoria el valor de las variables que se utilizan. Cada llamada a una función implica la nueva creación de las variables locales con su valor inicial. La declaración static añadida a una variable causa que la función retenga en memoria el valor de esa variable en cada llamada. Como puede ver en el ejemplo, las 50 llamadas a la función contador( ) dan siempre el mismo resultado, porque la variable $contador se crea con cada llamada.
<?php
 function contador()
 {
  $contador = 0;
  $contador += 1;
  return $contador;
 }
 
 for ($i = 0; $i < 50; $i++)
 {
  echo (contador() . ", ");
 }
?>
Cuando ejecutamos el ejemplo anterior, vemos que la salida son 50 veces el número 1, ya que cada vez que se llama a la función contador(), la variable $contador se crea y se le asigna el valor 0 y seguidamente se le suma 1. Anteponiendo la palabra reservada static delante de la variable $contador, hacemos que la variable no se cree ni se destruya al inicio y al fin de la función, haciendo que el valor de esta se guarde para próximas llamadas a la función.
<?php
 function contador()
 {
  static $contador = 0;
  $contador += 1;
  return $contador;
 }
 
 for ($i = 0; $i < 50; $i++)
 {
  echo (contador() . ", ");
 }
?>
include( ) y require( )
A medida que sus proyectos se hagan mas complejos y grandes, comenzará a crear funciones para realizar diversas acciones como conectarse a bases de datos, crear imágenes, conectar a servidor FTP, etcétera y, seguramente, quiera utilizar dichas funciones en otros proyectos para ahorrar tiempo.

Para poder realizar esto, tiene que guardar las funciones necesarias en un fichero con extensión .php, .htm, .inc, etcétera y utilizar las directivas include( ) o require( ) desde la Web que vaya a utilizarlas.

La diferencia entre ambas funciones es que include( ) es mas permisible a fallos que require( ), y permite continuar la ejecución del programa aunque se haya encontrado un fallo. Mi consejo es que debe utilizar require( ) para aplicaciones que necesiten obligatoriamente algún archivo crítico y no pueda continuarse la ejecución sin él.

Por último comentar que es posible que en el transcurso del proyecto, unos archivos se llamen a otros y podría pasar que un mismo archivo sea llamado varias veces en distintos puntos. Esto resultaría en un error bastante difícil de detectar. Para solventar esto, podemos utilizar las funciones require_once( ) e include_once( ), ya que utilizando estas funciones, si se intentar incluir el mismo archivo varias veces, PHP 5 ignorará las siguientes llamadas.
<?php
 include("funciones.php");
 include_once("funciones2.php");
 require("funciones3.php");
 require_once("funciones4.php");
?>
Recursividad
El paradigma de la programación nos lleva algunas veces a utilizar métodos que minimicen el esfuerzo en nuestros programas, a costa de aumentar la dificultad. Las funciones recursivas son aquellas capaz de llamarse a si mismas, como único requisito, es que haya una manera de salir de la llamada recursiva.

Utilizaremos dicha técnica para realizar el ejemplo del número factorial.
<?php
 function factorial($numero)
 {
  if($numero == 1)
  {
   return $numero;
  }
  else
  {
   return $numero * factorial($numero - 1);
  }
 }
 echo ("El factorial de 5 es ".factorial(5));
?>
Como vemos, dicho ejemplo carece de un bucle for, en su lugar, la función multiplica el número que se le pasa por número - 1. Cuando el número que se le pase sea igual a 1, la función deja de hacer llamadas recursivas y empieza a devolver valores hasta llegar al resultado final.

Funciones (3 de 3) PHP 5

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