<?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 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.
-