<?php
function a(&$num1, &$num2, $num3){
echo "Dentro de la función visibilizando 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";
}
//Ahora considero programa principal
$a=100;
$b=200;
$c=300;
echo "En el main antes de invocar a la función visualizando variables<hr />";
echo "Valor de variables \$a = $a \$b = $b \$c = $c <br />";
a($a,$b,$c);
echo "En el mail después de invocar a la función visualizando variables<hr />";
echo "Valor de variables \$a = $a \$b = $b \$c = $c <br />";
?>
Variables dentro de una función
- Dentro de una función las variables que declaremos son locales a esa función.
- No podré acceder a su valor fuera de la función
- Esto también implica que dentro de una función no puedo 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 función -$var1- <br /> ";
$var1++;
echo "Valor de <b>var1</b> dentro de función moficada -$var1- <br /> ";
}
$var1 = 20;
echo "Valor de <b>var1</b> en programa principal antes de invocar función: -$var1- <br />";
modifica_valor();
echo "Valor de <b>var1</b> en progrma principal después de invocar la función: -$var1- <br />";
?>
- Vemos que genera la siguiente salida
Valor de var1 en programa principal antes de invocar función: -20-
Valor de var1 dentro de función --
Valor de var1 dentro de función moficada -1-
Valor de var1 en progrma principal después de invocar la función: -20-
- Sin embargo si quieremos acceder al valor de $var dentro de la función, sí que podemos
- Hemos de usar la palabra reservada $global
<?php
function modifica_valor(){
global $var1; //Indicamos que esta variables se puede globalizar
echo "Valor de <b>var1</b> dentro de función -$var1- <br /> ";
$var1++;
echo "Valor de <b>var1</b> dentro de función moficada -$var1- <br /> ";
}
$var1 = 20;
echo "Valor de <b>var1</b> en programa principal antes de invocar función: -$var1- <br />";
modifica_valor();
echo "Valor de <b>var1</b> en progrma principal después de invocar la función: -$var1- <br />";
?>
- Ahora podemos observar cómo sí que se accede al valor dentro de la función
Valor de var1 en programa principal antes de invocar función: -20-
Valor de var1 dentro de función -20-
Valor de var1 dentro de función moficada -21-
Valor de var1 en progrma principal después de invocar la función: -21-
Funciones recursivas
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.
-