martes, 16 de septiembre de 2014

PHP (03) Funciones (06) Funciones anidadas

Puede ocurrir que queramos introducir funciones dentro de otras, algo que puede ser muy útil, pero que tiene un problema, es que las funciones como las variables existen solo en los ámbitos donde están definidas de modo que si queremos llamar a una función que se encuentra dentro de otra no podremos hacerlo desde el exterior si esta no ha sido leída primero o nos dará un error. Del mismo modo ocurre con funciones dentro de expresiones condicionales como los if.
Esto es debido a que PHP es un lenguaje interpretado, es decir,  que el código no es accesible hasta que lo maneja el interprete, por ello las funciones anidadas son inaccesibles hasta que se cargan como vemos en este ejemplo:
<?php
 echo '<p>Llamando a la función interior</p>';
 interior();
 
 function exterior()
 {
  echo '<p>Esta es la función exterior</p>';
  function interior()
  {
   echo '<p>Esta es la función interior</p>';
  }
 }  
?>

Lo cual nos da como resultado:
Llamando a la función interior
Fatal error: Call to undefined function interior() in C:\xampp\htdocs\miphp\cadenas.php on line 10

Este error fatal tiene lugar por que la función exterior() no ha sido cargada antes de llamar a la función que tiene dentro, pero como vemos en este ejemplo, si se llama a la función que encapsula a la interior antes de invocarla, el interprete sí la reconoce:
<?php
 echo '<p>Llamando a la función exterior</p>';
 exterior();
 echo '<p>Llamando a la función interior</p>';
 interior();
 
 function exterior()
 {
  echo '<p>Esta es la función exterior</p>';
  function interior()
  {
   echo '<p>Esta es la función interior</p>';
  }
 }  
?>

Como vemos en este ejemplo hemos llamado a la función exterior antes de invocar a la interior y en el resultado nos muestra que entonces sí se puede llegar a ella.
Llamando a la función exterior
Esta es la función exterior
Llamando a la función interior
Esta es la función interior

Podríamos pensar que si la llamada a la función interior tiene lugar desde la función exterior, entonces sí se puede acceder a ella, pero esto es relativo a donde se haga la llamada, ya que si se hace antes de que el interprete haya leído la función nos dará un error:
<?php
 echo '<p>Llamando a la función exterior</p>';
 exterior();
 
 
 function exterior()
 {
  echo '<p>Esta es la función exterior</p>';
  echo '<p>Llamando a la función interior desde la exterior</p>';
  interior();

  function interior()
  {
   echo '<p>Esta es la función interior</p>';
  }
  
 }  
?>

Cuyo resultado es:
Llamando a la función exterior
Esta es la función exterior
Llamando a la función interior desde la exterior
Fatal error: Call to undefined function interior() in C:\xampp\htdocs\miphp\cadenas.php on line 15

Pero si llamamos a a interior() después de que la función haya sido leída por completo:
<?php
 echo '<p>Llamando a la función exterior</p>';
 exterior();
 
 
 function exterior()
 {
  echo '<p>Esta es la función exterior</p>';
  echo '<p>Llamando a la función interior desde la exterior</p>';
  

  function interior()
  {
   echo '<p>Esta es la función interior</p>';
  }
  interior();
 }  
?>

Entonces tenemos el resultado esperado:
Llamando a la función exterior
Esta es la función exterior
Llamando a la función interior desde la exterior
Esta es la función interior

Con estos ejemplos podemos observar  como funciona el lenguaje interpretado, cargado por secciones según vayan haciendo falta, y de este modo ir ahorrandonos errores.

No hay comentarios:

Publicar un comentario