Apuntes PHP – Funciones y librerías

Estos son apuntes realizados para la asignatura de Desarrollo de Aplicaciones Web en Entorno Servidor del Ciclo Superior de Desarrollo de Aplicaciones Web (2ºDAW) en el I.E.S. Gran Capitán de Córdoba, impartida por José Aguilera, cuyos apuntes son utilizados como base junto con el portal oficial de PHP.

Esta es la séptima entrega de apuntes, pudiendo encontrar los anteriores en Apuntes PHP y en las que hemos tratado, una pequeña introducción, conceptos básicos, estructuras condicionales, bucles, arrays y gestión de formularios.

¿Qué son las funciones?

Una función es un trozo de código que realiza una tarea muy concreta y que se puede utilizar desde un programa para resolver esa necesidad. Por ejemplo, podemos tener una función que nos dice si un año es bisiesto o no, a la cual pasándole un año, nos devuelva es bisiesto o no es bisiesto.

Esto nos permitiría, que si en varias partes de nuestro código necesitamos obtener esa información y analizar valores, podamos hacerlo sin necesidad de escribir todo el código, sino simplemente haciendo una llamada a la función.

Declaración de una función

Para declarar una función, debemos incluir al inicio la palabra reservada function, posteriormente su nombre y entre paréntesis los argumentos. A continuación, entre llaves se desarrollará la función y, si es necesario, se devolverá un valor.

Ejemplo:

function nombreFuncion([argumentos])[:tipo] {
// acciones a realizar
[return valor;]
}

Los argumentos, también conocidos como parámetros formales, son una lista de declaraciones de variables separadas por comas.

La instrucción return tiene carácter opcional y es utilizada para retornar un valor a la llamada.

Llamada a una función

La llamada a una función se realiza simplemente escribiendo el nombre de la función y paréntesis, entre los mismos, en caso de que la función requiera recibir algún parámetro se introducirían los valores.

Ejemplo:

nombreFuncion ([argumentos]);

Ejemplo con código de la declaración de una función sin argumentos y una llamada:

<?php
    /**
     * @author: manolohidalgo_
     * 
     * Ejemplo de la creación de una función que mostrará los números del 1 al 10 en pantalla.
     */

     // Declaración de una función sin argumentos
     function muestraNumeros(){
         for ($numero = 1; $numero < 11; $numero++){
             echo $numero.'<br/>';
         }
     }

     // Llamada a la función
     muestraNumeros();
?>

Como vemos, en este caso, tanto al crear la función como cuando la llamamos, los paréntesis se encuentran vacíos, no se incluye ningún argumento y tampoco devuelve ningún valor.

Ejemplo de la declaración de una función con argumentos y su llamada:

<?php
    /**
     * @author: manolohidalgo_
     * 
     * Ejemplo de la creación de una función que saludará y mencionará una edad.
     */

     // Declaración de una función con argumentos
     function saluda($nombre, $edad){
         echo 'Hola '.$nombre.', yo también tengo '.$edad.' años';
     }

     // Llamada a la función
     saluda("Manolo", 34);
?>

En este caso, vemos que la función al declararse indica las dos variables que debe recibir, $nombre y $edad, y al realizar la llamada, incluimos los valores que tendrán estas variables, “Manolo” y 34 en este caso. Obviamente, también podría haberse incluido estos valores mediante otras variables que tuviésemos declaradas previamente.

Ámbito de las variables

En php las variables declaradas dentro de una función y los parámetros son locales, y por tanto, accesibles sólo desde dentro de la función.

Esto quiere decir que desde una función no podemos acceder a variables declaradas fuera de ella, para poder hacerlo, estas tendrían que estar declaradas como Global $variable, las cuales se almacenan en $GLOBALS, pero no se recomienda el uso de este tipo de variables.

Variables estáticas

Este tipo de variables conservan el valor de una llamada a otra de la función, por lo general las variables normales “reinician” su valor en cada llamada, pero las de tipo static lo mantienen.

Declaración de una variable estática:

static $variable = valor;

Veamos el ejemplo de una función que tendrá un contador1 que será estático y un contador2 que será declarada de forma normal. La función aumentará en 1 el valor a cada llamada, y la vamos a llamar en cuatro ocasiones.

<?php
    /**
     * @author: manolohidalgo_
     * 
     * Ejemplo de la creación de una función que aumentará 1 a una variable en cada iteración.
     */

     // Declaración de una función con variable  static
     function contador(){
        static $contador1 = 0;
        $contador2 = 0;
        $contador1++;
        $contador2++;

        echo $contador1.' /  ';
        echo $contador2.'<br/>';
     }

     // Llamada a la función
     contador(); // muestra en pantalla 1 / 1
     contador(); // muestra en pantalla 2 / 1
     contador(); // muestra en pantalla 3 / 1
     contador(); // muestra en pantalla 4 / 1
?>

Paso de parámetros por valor / referencia

Cuando pasamos los parámetros a una función, se pueden hacer tanto por valor como por referencia, ¿Qué implica esto?

Un parámetro pasado por valor genera una nueva variable dentro de la función (puede incluso tener el mismo nombre, pero su ámbito es diferente al programa principal), los cambios que se hagan en ella no afectan a la primera, por decirlo de alguna forma, es una copia de la variable que se le pasa.

En cuanto a los pasos de parámetros por referencia hemos de tener en cuenta que lo que se envía es la referencia a una variable, es decir, no se copia, sino que se trabaja sobre la variable inicial (aunque pueda tener otro nombre dentro de la función) y cualquier modificación que sufra en la función se verá reflejada en el programa principal.

Ejemplo de dos variables y una función que incrementa en 1, una variable la recibirá “normal” y la otra por referencia, vemos como la que ha recibido por referencia, varía su valor fuera de la función.

<?php
    /**
     * @author: manolohidalgo_
     * 
     * Ejemplo de la creación de una función que aumentará 1 los argumentos recibidos, el recibido por referencia varía su valor en el script general.
     */
    $variable1 = 5;
    $variable2 = 5;

     // Declaración de una función con variable 
     function incrementa($variable1, &$variable2Ref){
        $variable1++;
        $variable2Ref++;
     }

     // Mostramos valores iniciales:
     echo 'variable1: '.$variable1.' variable2: '.$variable2.'<br/>'; // muestra: variable1: 5 variable2: 5
     // Llamamos a la función
     incrementa($variable1, $variable2);

     // Mostramos de nuevo el valor de las variables
     echo 'variable1: '.$variable1.' variable2: '.$variable2; // muestra: variable1: 5 variable2: 6

?>

Argumentos por defecto

PHP, al igual que otros lenguajes, nos permite establecer un valor por defecto para aquellos argumentos que no sean especificados al llamar a una función.

Por ejemplo, vamos a hacer de nuevo la función saluda del ejemplo anterior, pero en esta ocasión vamos a establecer que el argumento por defecto de $edad es 34, de forma que va a devolver el mismo resultado, sin necesidad de pasarle ese valor en la llamada a la función.

Para ello, en la declaración de la función sólo debemos indicar en el argumento $edad la expresión $edad=34, tal y como vemos en la línea 9. Es importante, que el caso de que haya valores predeterminados, estos queden a la derecha de los que serán asignados por el usuario, sino fallaría.

<?php
    /**
     * @author: manolohidalgo_
     * 
     * Ejemplo de la creación de una función que saludará y mencionará una edad.
     */

     // Declaración de una función con argumentos
     function saluda($nombre, $edad=34){
         echo 'Hola '.$nombre.', yo también tengo '.$edad.' años';
     }

     // Llamada a la función
     saluda("Manolo", 34);
?>

Manejo de argumentos. Funciones

Para el manejo de los argumentos php cuenta con un conjunto de funciones interesantes, destacamos algunas de ellas:

  • func_num_args: devuelve el número de parámetros pasados a la función.
  • func_get_args: devuelve la lista de parámetros pasados a la función (en una matriz)
  • func_get_args: devuelve el valor de un parámetro cuyo número se especifica.

Devolución de valores.

El tipo de valor devuelto en una función puede ser especificado en la cabecera de la declaración mediante la inclusión de : tipo antes del inicio de las llaves.

La devolución del valor se realizará mediante la instrucción return

Veamos un ejemplo de una función, que en esta ocasión no va a mostrar directamente por pantalla, sino que devolverá un valor que será mostrado en el flujo normal de nuestro script.

<?php
    /**
     * @author: manolohidalgo_
     */

     // Declaración de una función que devuelve un entero
     function suma($valor1, $valor2):int {
        return $valor1+$valor2;
     }
    
     $a = 4;
     $b = 9;
     // Llamada a la función
     echo $a.' + '.$b.' = '.suma($a,$b);
?>

Recursividad

La recursividad es la propiedad que permite a una función llamarse a sí misma. Su importancia se encuentra en la existencia de aquellos problemas donde la solución se basa en algoritmos recursivos.

De manera general, los algoritmos recursivos tendrán una parte responsable de la llamada y otra encargada de realizar la ruptura den la sucesión de llamadas.

Veamos un ejemplo de una función recursiva, y lo vamos a analizar posteriormente paso a paso para aclarar este funcionamiento.

<?php
    /**
     * @author: manolohidalgo_
     */

     // Función factorial recursivo
     function factorial($n){
         if ($n == 0){
             return 1;
         } else {
             return $n * factorial($n-1);
         }
     }

     echo factorial(3);
?>

¿Cómo funciona esto? Lo analizamos en el siguiente gráfico
Recordemos que el factorial de un número, es el resultado de la multiplicación de ese número por todos los números inferiores hasta llegar a 1. En este caso hemos puesto un número pequeño para entender el funcionamiento (3),

Función anónima

Una función anónima es aquella a la que no se le ha asignado nombre en su declaración.

Se puede utilizar como el valor de una variable o como una función de devolución de llamada a otra función.

Ejemplo de una función anónima que muestra en pantalla un mensaje:

<?php
    /**
     * @author: manolohidalgo_
     */

    $saludo = function ($mensaje){
        echo "Contenido del mensaje: ".$mensaje."<br>";
    };
    $saludo("Hola Mundo");
    $saludo("Mensaje de prueba");
?>

En este caso, vemos como la función es asignada a una variable, la cual se usa para hacer llamada a la función, incluyendo entre paréntesis el mensaje que queremos mostrar.