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

Entradas populares de este blog

Leer un fichero properties con java.util.Properties

Los ficheros .properties son simples ficheros de texto que se suelen utilizar para guardar parámetros de configuración, en forma de pares clave-valor. Ejemplo de fichero: configuration.properties #User parameters user.name=Ana user.language=spanish Si estamos usando Java, podemos utilizar la clase java.util.Properties para leer los parámetros de este fichero: private static final String USER_NAME = "user.name"; private static final String USER_LANGUAGE = "user.language"; public void showProperties() throws Exception { Properties p = new Properties(); InputStream is = App.class.getResourceAsStream("/configuration.properties"); p.load(is); is.close(); String userName = p.getProperty(USER_NAME); String userCountry = p.getProperty(USER_LANGUAGE); System.out.println("userName: "+userName); System.out.println("userLanguage: "+userCountry); } Después de ejecutar este método, obtendríamos la siguiente salida: ...

JSF 2.0: Managed Beans (III)

Anteriormente ya hemos visto que cuando se declara un bean, tenemos que darle un scope: application, session, view, request, none. Un scope es un mapeo entre nombres y objetos que se almacena durante un determinado periodo de tiempo. En este post vamos a explicar cada uno de ellos. Si declaramos el bean desde el fichero faces-config.xml, indicamos el scope en <managed-bean-scope> y si queremos hacerlo con anotaciones, utilizaremos @{Application,Session,View,Request,None}Scoped Application Con este scope, se guarda la información durante toda la vida de la aplicación web, independientemente de todas las peticiones y sesiones que se realicen. Este bean se instancia con la primera petición a la aplicación y desaparece cuando la aplicación web se elimina del servidor. Si queremos que el bean se instancie antes de que se muestre la primera página de la aplicación, usamos la propiedad eager a true. @ManagedBean(eager=true) ó <managed-bean eager="true"> Session...

JSF 2.0: Message bundles

Los message bundles son ficheros .properties que guardan mensajes del tipo clave=valor. Si centralizamos todos los mensajes de nuestra aplicación en estos ficheros, es más fácil poder localizarlos si queremos realizar algún cambio y también nos ayuda para la internacionalización de la aplicación. Ejemplo: messages.properties (en src/java/com/examples) con dos mensajes name=Tu nombre: age=Tu edad: ¿Cómo los declaramos? 1) En cada página JSF donde lo necesitemos <f:loadBundle basename="com.examples.messages" var="msgs"/> 2) De manera global en faces-config.xml <application>      <resource-bundle>           <base-name>com.examples.messages</base-name>           <var>msg</var>      </resource-bundle> </application> Esta opción es más eficiente ya que sólo crea el bundle una v...