|
|
Línea 1: |
Línea 1: |
| <div id=parrafo> | | <div id=parrafo> |
− | <div class=slide>
| + | |
− | ==Funciones==
| + | |
| {{ManuelRomero/PHP/funciones}} | | {{ManuelRomero/PHP/funciones}} |
− | ===Funciones recursivas===
| |
| {{ManuelRomero/PHP/funcionesRecursivas}} | | {{ManuelRomero/PHP/funcionesRecursivas}} |
| | | |
Revisión de 18:33 5 nov 2024
Funciones
Objetivo
- Las funciones son un elemento fundamental
- Permiten crear código modular.
- Ayudan a estructurar el programa de manera ordenada.
|
Declaración de funciones
// Declarar una función
function nombre_de_funcion([tipo_de_parametro] $parametro_formal[=valor_por_defecto], ...)[: tipo_retorno]
{
...
[return ...];
}
// Llamar
nombre_de_funcion($parametro_real);
- Es importante diferenciar entre **declarar** una función e **invocar** una función.
- Aunque parece obvio, es un punto importante.
- En la declaración de una función, tenemos tres partes:
- Nombre o identificación de la función
- Parámetros formales
- Se especifican entre paréntesis. (Los paréntesis son necesarios, aunque no haya parámetros).
- Se puede especificar el tipo de cada parámetro (a partir de la versión 7.2).
- Se puede asignar un valor por defecto (si un parámetro tiene valor por defecto, no es obligatorio proporcionarle un valor en la invocación).
- Tipo de retorno
Es opcional.
- El cuerpo de la función. Dentro de él puede estar la instrucción `return`, la cual finaliza la ejecución de la función y devuelve el flujo al programa, a la instrucción que llamó a la función.
- `return` puede (o debe) devolver el valor que queremos que la función retorne.
- Identificador de función
- El nombre de la función es un identificador que empieza por una letra o guion bajo, seguido de 0 o más letras, números o guiones bajos.
Tip: Expresión regular para el identificador de funciones:
[a-zA-Z_f_][a-zA-Z0-9_]*
- Parámetros formales
- Son nombres de variables que usaremos al escribir el código o cuerpo de la función.
- El nombre debe ser significativo y se convertirán en variables locales a la función.
- Al finalizar la función, estas variables se eliminan de la memoria.
Los parámetros formales son variables locales a la función.
|
Proceso de creación / invocación de una función
- Primero, declaramos la función
- Esto implica reservar una zona de memoria identificada con el nombre de la función.
- El contenido de esas posiciones de memoria será el conjunto de acciones de la función.
- Estas acciones estarán definidas en función de los **parámetros formales** de la declaración.
- Invocación de la función
- La invocación es una instrucción para ejecutar la función.
- Lo primero que ocurre es que el programa accede a esa zona de memoria.
- Luego, se asignan los valores reales de la invocación a los parámetros formales de la función.
- Cuando la función termina de ejecutarse, se retorna a la instrucción que sigue a la llamada.
- Si la función devuelve un valor, este se asigna a la variable de la instrucción de asignación desde la cual se invocó.
Ejercicio usando funciones
Escribe un programa en el que en el programa principal se declaren dos variables, $a y $b.
- Crea una función que reciba como parámetros locales $a y $b,
- La función debe visualizar el valor de las variables, modificarlas, y volver a visualizarlas.
- En el programa principal:
- Asigna valor a las variables.
- Visualízalas.
- Invoca la función.
- Visualiza de nuevo las variables.
|
<?php
function a($a, $b){
echo "Dentro de la función visualizando valores <hr />";
echo "Valor de los parámetros \$a = $a \$b = $b <br />";
$a += 5;
$b += 5;
echo "Valor de los parámetros \$a = $a \$b = $b <br />";
echo "Salgo de la función";
}
//Programa principal
$a = 100;
$b = 200;
echo "En el main antes de invocar la función visualizando variables<hr />";
echo "Valor de variables \$a = $a \$b = $b <br />";
a($a, $b);
echo "En el main después de invocar la función visualizando variables<hr />";
echo "Valor de variables \$a = $a \$b = $b <br />";
?>
Parámetros formales: Valores y referencias
- Como hemos visto, los parámetros formales reciben valores pasados en la invocación de la función.
- Si queremos que la función pueda modificar el valor de los parámetros, debemos pasarlos **por referencia**.
- Esto permite que se pase la dirección de memoria donde se guarda el valor, en lugar del valor en sí.
- En PHP no podemos visualizar ni operar con la dirección de memoria, ya que no existe la aritmética de punteros.
- Parámetros formales
- Valores y referencias
Para pasar el parámetro por referencia, simplemente coloca el símbolo & antes del nombre de la variable en la declaración de los parámetros:
function nombre_funcion(&$paramRef1, &$paramRef2, $paramVal1){
...
}
Ejercicio usando funciones y parámetros
Escribe un programa donde en el programa principal se declaren tres variables: $a, $b y $c.
- Crea una función que reciba como parámetros &$num1, &$num2 y $num3.
- La función debe visualizar el valor de las variables, modificarlas, y volver a visualizarlas.
- En el programa principal:
- Asigna valor a las variables.
- Visualízalas.
- Invoca la función.
- Visualiza de nuevo las variables.
|
<?php
function a(&$num1, &$num2, $num3){
echo "Dentro de la función visualizando valores <hr />";
echo "Valor de los parámetros \$num1 = $num1 \$num2 = $num2 \$num3 = $num3<br />";
$num1 += 5;
$num2 += 5;
$num3 += 5;
echo "Valor de los parámetros \$num1 = $num1 \$num2 = $num2 \$num3 = $num3<br />";
echo "Salgo de la función";
}
//Programa principal
$a = 100;
$b = 200;
$c = 300;
echo "En el main antes de invocar la función visualizando variables<hr />";
echo "Valor de variables \$a = $a \$b = $b \$c = $c <br />";
a($a, $b, $c);
echo "En el main después de invocar la función visualizando variables<hr />";
echo "Valor de variables \$a = $a \$b = $b \$c = $c <br />";
?>
- Invocando funciones
- Una vez creada una función, se puede invocar como si fuera una instrucción.
- No sin razón, en ciertos contextos se refiere a funciones como "instrucciones virtuales".
- En PHP, puedes invocar una función antes de declararla, siempre que esté en el mismo archivo.
|
Ejemplo de invocación de funciones
|
|
Tip: Este código funcionará correctamente
<?php
a(5, 6);
/*Más instrucciones*/
function a($a, $b){
echo "Valor de $a";
echo "Valor de $b";
}
|
|
Ejemplo de invocación de funciones
|
|
Tip: Este código no funcionará
<?php
a(5, 6);
/*Más instrucciones*/
include ("funciones.php");
?>
- Contenido del archivo funciones.php
<?php
function a($a, $b){
echo "Valor de $a";
echo "Valor de $b";
}
?>
|
Variables dentro de una función
- Dentro de una función, las variables que declaremos son **locales** a esa función.
- No se puede acceder a su valor fuera de la función.
- Esto también implica que dentro de una función no se puede acceder al valor de una variable definida fuera de la función.
- Observa el siguiente ejemplo:
<?php
function modifica_valor(){
echo "Valor de <b>var1</b> dentro de la función: -$var1- <br />";
$var1++;
echo "Valor de <b>var1</b> dentro de la función, modificado: -$var1- <br />";
}
$var1 = 20;
echo "Valor de <b>var1</b> en el programa principal antes de invocar la función: -$var1- <br />";
modifica_valor();
echo "Valor de <b>var1</b> en el programa principal después de invocar la función: -$var1- <br />";
?>
- Genera la siguiente salida:
Valor de var1 en el programa principal antes de invocar la función: -20-
Valor de var1 dentro de la función: --
Valor de var1 dentro de la función, modificado: -1-
Valor de var1 en el programa principal después de invocar la función: -20-
- Si queremos acceder al valor de $var1 dentro de la función, podemos usar la palabra reservada global:
<?php
function modifica_valor(){
global $var1; // Indicamos que esta variable se puede usar globalmente.
echo "Valor de <b>var1</b> dentro de la función: -$var1- <br />";
$var1++;
echo "Valor de <b>var1</b> dentro de la función, modificado: -$var1- <br />";
}
$var1 = 20;
echo "Valor de <b>var1</b> en el programa principal antes de invocar la función: -$var1- <br />";
modifica_valor();
echo "Valor de <b>var1</b> en el programa principal después de invocar la función: -$var1- <br />";
?>
- Ahora, observamos que el valor dentro de la función se puede acceder y modificar.
Valor de var1 en el programa principal antes de invocar la función: -20-
Valor de var1 dentro de la función: -20-
Valor de var1 dentro de la función, modificado: -21-
Valor de var1 en el programa principal después de invocar la función: -21-
Funciones recursivas
- Al igual que en otros lenguajes de programación, en PHP el uso de funciones recursivas es una opción muy interesante cuando necesitamos obtener valores que dependen de cálculos repetitivos sobre sí mismos
- Claros ejemplos son casos de factoriales, secuencias de Fibonacci, o procesamiento de estructuras de datos jerárquicas (por ejemplo, árboles o directorios anidados).
¿Qué es una Función Recursiva?
Una función recursiva es aquella que se llama a sí misma para resolver un problema que puede dividirse en subproblemas más pequeños y de la misma naturaleza.
|
- La idea principal es que la función continúe llamándose a sí misma, resolviendo cada vez una parte más pequeña del problema, hasta que alcanza una condición base que detiene las llamadas recursivas.
- Ejemplo de Factorial con Recursividad
El cálculo del factorial de un número n es un ejemplo clásico de recursividad. El factorial de n (representado como n!) se calcula multiplicando n por el factorial de n - 1 hasta llegar a 1. En términos matemáticos:
𝑛!=𝑛 × (𝑛−1) × (𝑛−2)×...× 1
Podemos implementar esto en PHP usando una función recursiva:
function factorial($num) {
return $num <= 1 ? 1 : $num * factorial($num - 1);
}
echo factorial(5); // Salida: 120
- La condición base es cuando num es igual a 1, devolviendo 1 y deteniendo la recursión.
- Si num es mayor que 1, la función llama a factorial de nuevo con el valor num - 1, multiplicándolo por num.
Ventajas y Desventajas de la Recursión
- Ventajas
- Código más limpio y legible: Las soluciones recursivas suelen ser más compactas y fáciles de entender que sus equivalentes iterativas.
- Ideal para problemas jerárquicos: La recursión es muy útil para trabajar con datos que tienen una estructura de árbol o jerárquica, como explorar directorios o manejar datos de tipo árbol (DOM, menús anidados, etc.).
- Desventajas
- Consumo de memoria: Cada llamada recursiva agrega un nuevo nivel al stack de llamadas de PHP, lo cual puede llevar a un error de desbordamiento si la recursión es profunda o si no se define correctamente la condición base.
- Complejidad de depuración: Las funciones recursivas pueden ser más difíciles de depurar debido a la cantidad de llamadas anidadas que se realizan.
Consideraciones Importantes al Usar Recursividad en PHP
- Podríamos generalizar para cualquier lenguaje de programación
- Establecer una condición base clara
-
- Sin una condición base, la función entrará en un ciclo infinito de llamadas hasta que se agote la memoria.
- Evaluar el caso iterativo
-
- A veces, una solución iterativa (usando bucles) puede ser más eficiente y evitar problemas de memoria.
- Controlar la profundidad
-
- PHP establece un límite en la profundidad de recursión por defecto (generalmente 100 o 1000 niveles), aunque este límite puede configurarse. Sin embargo, es importante considerar la eficiencia y el consumo de memoria.
Funciones anónimas
Qué son
- Son funciones que no tienen nombre
- Se conocen como (funciones de clousura funciones cierre), y de hecho implementa la clase (Clousura)[1]
- Crear una función anónima
-
function (){
return "Hola desde una función anónima";
}
|
Pregunta
- Ahora viene la paradoja de para qué puede servir y cómo la puedo invocar.
|
- Para invocar a una función anónima tenemos dos formas
-
- A través de las variables de funciones
- Como argumento en una función, o sea que el parámetro de una función sea otra función
- Variables de funciones
- Declaro una variable y le asigno una función
- En realidad es una forma diferente de declarar la función e invocarla, tiene la ventaja de gestionar todo como variables (posible comodidad por parte del programador)
- Si uso esta técnica, no puedo invocar a la función antes de su declaración (ya que no existe en contenido de la variable)
- Consiste en declarar una variable y asiganer la función
- Posteriormente podré invocar la función a través de la variable (he de poner también paréntesis en la invocación y no olvidar el ; (punto y coma) en la asignación)
<?php
$mi_funcion = function () {
return "hola caracola";
};
d
echo $mi_funcion();
//imprimiría "hola caracola"
//=====================================
echo $mi_funcion();
$mi_funcion = function () {
return "hola caracola";
};
//Este código fallaría,
//=====================================
<?php
echo mi_funcion();
function mi_funcion () {
return "hola caracola";
};
//Este código funcionaría, php legunaje de doble pasada en su interpretación,
?>
- Invocación usando la función como un parámetro en otra función
- Esto se puede conseguir ver, usando alguna función del sistema que espere recibir una función de clausura, como iremos viendo a lo largo del curso.
spl_autoload_register(https://www.php.net/manual/es/function.spl-autoload-register.php)
array_walk (https://www.php.net/manual/es/function.array-walk.php)
array_map (https://www.php.net/manual/es/function.array-map.php)
array_reduce (https://www.php.net/manual/es/function.array-reduce.php)
- Otra forma de utilizarlo, es usando la función call_user_func, con esta función invocamos a una función anónima, necesitamos acceder a ello, y lo podemos hacer a través de un identificador, o escribiendo el código de la funćión anónima
<?php
call_user_func(function ($nombre){echo "hola $nombre";}, "Manuel");
//Este código nos escribirá "hola Manuel";
?>
- Podríamos implementar el código anterior usando variables, posiblemente se puede considerar que mejoraríamos en legibilidad
<?php
$saludar = function ($nombre){
echo "hola $nombre";
};
call_user_func($saludar, "Manuel");
?>
Funciones flecha
- Las funciones flecha es una forma más corta de escribir funciones anónimas simples
Aparece en php en la versión 7.4
- Limitaciones de funciones flecha.
-