Ir al contenido principal

Aprendiendo PHP - Funciones

PHP contiene una gran cantidad de funciones en librerías, pero antes o después necesitaremos crear nuestras propias funciones.

function nombre() {
   ...
}
No es necesario definir la función antes de invocarla porque PHP lee el script completo antes de ejecutarlo. De todas maneras, esta práctica no es muy habitual.


Los argumentos de una función
Por defecto los argumentos se pasan por valor. Esto significa que cualquier cambio que se le haga a estas variables dentro de la función, se ignorará fuera de ella.
<?php
   function cambiaColor($cadena) {
      $cadena = 'Rojo';
   }
   $cadena = 'Verde';
   cambiaColor($cadena);
   // Para llamar a una función se especifica su nombre.
   echo $cadena;  // $cadena es Verde
?>
Para que estos cambios sí se reflejen, habría que pasarlos por referencia. Para ello hay que añadirle & al parámetro en cuestión.
<?php
   function cambiaColor(&$cadena) {
      $cadena = 'Rojo';
   }
   $cadena = 'Verde';
   cambiaColor($cadena);
   echo $cadena;  // $cadena es Rojo
?>
A partir de PHP 5, se pueden asignar valores por defecto a los argumentos de una función, por si no se les proporciona ningún valor. Estos argumentos deben aparecer al final de la lista de argumentos y tener valores constantes.
<?php
   function cambiaColor($cadena='Amarillo') {
      echo $cadena;
   }
   cambiaColor('Verde'); // Muestra Verde
   cambiaColor();        // Muestra Amarillo
?>
Para definir argumentos opcionales, se les asigna un valor nulo de la siguiente manera:
<?php
   function multiplica($num1,$num2="") {
      echo $num1*$num2;
   }
   multiplica(3,4); // 12
   multiplica(2);   // 0
?>
Para acceder a variables globales desde una función, podemos utilizar global
<?php
   $color = 'Rojo';
   function muestraColor() {
      global $color;
      echo $color;
   }
   muestraColor(); // Muestra Rojo
?>
o el array $GLOBALS
<?php
   $color = 'Rojo';
   function muestraColor() {
      echo $GLOBALS['color'];
   }
   muestraColor(); // Muestra Rojo
?>
También se pueden crear funciones con un número variable de argumentos. Para ello tenemos las funciones func_num_args(), func_get_arg() y func_get_args().
<?php
   function muestraColores() {
      if (func_num_args() > 0) {
         $color = func_get_arg(0);
         // Cogemos el primer argumento
         echo $color;
      } else {
         echo 'Amarillo';
      }
   }
   muestraColores();  // Amarillo
   muestraColores('Rojo');  // Rojo
   muestraColores('Verde','Rojo','Lila'); // Verde
?>


Valores devueltos por una función
Se utiliza return para devolver un valor. También se puede utilizar return para parar la ejecución de una función, sin necesidad de devolver nada.
<?php
   function multiplica($num1, $num2) {
      return $num1 * $num2;
   }
   echo multiplica(3, 4); // 12
?>
Para devolver múltiples valores, se utiliza un array y list(). Veámoslo fácilmente con un ejemplo:
<?php
   function listaColores() {
      $colores[] = 'Rojo';
      $colores[] = 'Verde';
      $colores[] = 'Amarillo';
      return $colores;
   }
   list($col1,$col2,$col3) = listaColores();
   echo "$col1 $col2 $col3"; // Rojo Verde Amarillo
?>
Si queremos tener una librería con nuestras propias funciones, creamos un fichero llamado por ejemplo nombre.library.php y así podríamos incluirlo desde cualquier otro fichero (con include o require, tal y como vimos en el artículo anterior).

EJERCICIOS

1) ¿Cuál será el valor de $num al final de la ejecución?
<?php
   $num = 3;
   function num($num="") {
      $num = 4;
   }
   echo $num;
?>
a) 3
b) 4
c) Error de sintaxis

2) ¿Cuál será el valor de $num al final de la ejecución?
<?php
   $num = 3;
   function num(&$num="") {
      $num = 4;
   }
   num($num);
   echo $num;
?>
a) 3
b) 4
c) Error de sintaxis

3) ¿Cuál será el valor de $num al final de la ejecución?
<?php
   $num = 3;
   function num(&$num="") {
      $num = 4;
   }
   num();
   echo $num;
?>
a) 3
b) 4
c) Error de sintaxis

4)  ¿Qué se mostrará por pantalla?
<?php
   function setColor($col) {
      $color = $col;
   }
   setColor('Amarillo');
   echo "El color es: $color";
?>
a) El color es:
b) El color es: Amarillo
c) Error de sintaxis

5) ¿Cuál será la salida?
<?php
   $a = 1;
   $b = 2;
   $c = 3;
   function pru() {
      global $b;
      $b += 3;
      $GLOBALS['a'] = 5;
   }
   pru();
   echo "$a $b $c";
?>
a) 1 2 3
b) 5 2 3
c) 5 5 3

6) ¿Qué se mostrará por pantalla?
<?php
   function pru($a, $a=3, $a=7) {
      return $a;
   }
   echo pru(13);
?>
a) 13
b) 7
c) 3

Comentarios