Diferencia entre revisiones de «Plantilla:ManuelRomero/PHP/funcionesAnonimas»

De WikiEducator
Saltar a: navegación, buscar
(Página creada con «==Funciones anónimas== <br /> {{MRM_Definicion|Title=Qué son| ;Son funciones que no tienen nombre ;Se conocen como (funciones de clousura funciones cierre), y de hecho im...»)
 
(Funciones Anónimas)
 
(2 revisiones intermedias por el mismo usuario no mostrado)
Línea 1: Línea 1:
==Funciones anónimas==
+
==Funciones Anónimas==
 
<br />
 
<br />
{{MRM_Definicion|Title=Qué son|
+
 
;Son funciones que no tienen nombre
+
{{MRM_Definicion|Title=¿Qué son?|
;Se conocen como (funciones de clousura funciones cierre), y de hecho implementa la clase (Clousura)[https://www.php.net/manual/es/class.closure.php]
+
;Son funciones que no tienen nombre.
;Crear una función anónima:
+
;También se conocen como '''funciones de clausura''' o '''funciones cierre'''. En PHP, las funciones anónimas implementan la clase `Closure` ([documentación de Closure](https://www.php.net/manual/es/class.closure.php)).
 +
;Para crear una función anónima en PHP, se usa la siguiente estructura:
 
<source lang=php>
 
<source lang=php>
function (){
+
function () {
return "Hola desde una función anónima";
+
    return "Hola desde una función anónima";
}
+
};
 
</source>
 
</source>
 
}}
 
}}
  
<br />
 
 
{{MRM_Pregunta|
 
{{MRM_Pregunta|
;Ahora viene la paradoja de para qué puede servir y cómo la puedo invocar.
+
;Puede parecer paradójico, pero ¿para qué sirve una función anónima y cómo podemos invocarla?
 
}}
 
}}
<br />
+
 
;Para invocar a una función anónima tenemos dos formas:
+
;En PHP, existen dos formas principales de invocar una función anónima:
:<span id=r>A través de las variables de funciones</span>
+
:<span id=r>1. A través de variables de función.</span>
:<span id=r>Como argumento en una función</span>, o sea que el parámetro de una función sea otra función
+
:<span id=r>2. Como argumento en otra función.</span> Es decir, pasamos la función anónima como parámetro a otra función.
;Variables de funciones
+
 
*Declaro una variable y le asigno una función
+
====Variables de 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)
+
* En PHP, podemos asignar una función anónima a una '''variable''' y luego invocar la función a través de esa variable. Esta técnica permite trabajar con funciones de forma similar a las variables, lo que puede ser cómodo en ciertos casos.
*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)
+
* Usar variables de función requiere tener presente que no podemos invocar la función antes de la asignación, ya que hasta ese punto, la función no existe en la variable.
*Consiste en declarar una variable y asiganer la función
+
* Para asignar una función anónima a una variable, simplemente declaramos la variable y le asignamos la función. Para invocarla, solo tenemos que llamar a la variable como si fuera una función, usando paréntesis `()`.
*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)  
+
 
 
<source lang=php>
 
<source lang=php>
 
<?php
 
<?php
 
$mi_funcion = function () {
 
$mi_funcion = function () {
return "hola caracola";
+
    return "hola caracola";
 
};
 
};
d
 
echo $mi_funcion();
 
//imprimiría "hola caracola"
 
//=====================================
 
  
 +
echo $mi_funcion(); // Imprime: hola caracola
 +
?>
 +
</source>
 +
 +
*Si intentamos invocar la función antes de asignarla a la variable, obtendremos un error.*
 +
 +
<source lang=php>
 +
// Error: La función no existe antes de la asignación
 
echo $mi_funcion();
 
echo $mi_funcion();
  
 
$mi_funcion = function () {
 
$mi_funcion = function () {
return "hola caracola";
+
    return "hola caracola";
 
};
 
};
//Este código fallaría,
+
</source>
//=====================================
+
<?php
+
echo mi_funcion();
+
  
function mi_funcion () {
+
====Comparación con Funciones Nombradas====
return "hola caracola";
+
En cambio, si usáramos una '''función nombrada''' en lugar de una función anónima, PHP podría procesarla sin importar el orden, debido a su interpretación en dos pasadas:
};
+
  
//Este código funcionaría, php legunaje de doble pasada en su interpretación,
+
<source lang=php>
?>
+
<?php
 +
echo mi_funcion(); // Esto funcionará debido a la doble pasada de PHP
  
 +
function mi_funcion() {
 +
    return "hola caracola";
 +
}
 +
?>
 
</source>
 
</source>
  
 +
====Pasar Funciones Anónimas como Parámetros en Otras Funciones====
 +
* Otra manera de usar funciones anónimas es pasarlas como '''parámetros en otras funciones'''. En PHP, hay varias funciones del sistema que aceptan una función de clausura como argumento. Al usar funciones anónimas en estos casos, podemos crear lógica personalizada que se ejecuta en el contexto de la función de nivel superior.
  
 +
Algunos ejemplos de funciones del sistema que aceptan funciones de clausura como argumentos son:
 +
- [`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)
  
<source lang=php>
+
====Uso de `call_user_func` para Invocar Funciones Anónimas====
 
+
* Otra forma de invocar una función anónima es mediante la función '''`call_user_func`'''. Esta función acepta una función anónima como primer argumento y, opcionalmente, otros argumentos que serán pasados a la función anónima.
</source>
+
;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 <span id=r>call_user_func</span>, 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
 
 
<source lang=php>
 
<source lang=php>
 
<?php
 
<?php
call_user_func(function ($nombre){echo "hola $nombre";}, "Manuel");
+
call_user_func(function ($nombre) {
 
+
    echo "Hola $nombre";
//Este código nos escribirá "hola Manuel";
+
}, "Manuel");
 +
// Este código imprimirá: Hola Manuel
 
?>
 
?>
 
</source>
 
</source>
*Podríamos implementar el código anterior usando variables, posiblemente se puede considerar que  mejoraríamos en legibilidad
+
====Mejorar la Legibilidad Usando Variables====
 +
*En lugar de escribir la función anónima directamente en '''call_user_func''', podemos asignarla a una variable para mejorar la legibilidad del código.
 
<source lang=php>
 
<source lang=php>
 
<?php
 
<?php
$saludar = function ($nombre){
+
$saludar = function ($nombre) {
echo "hola $nombre";
+
    echo "Hola $nombre";
 
};
 
};
  
 
call_user_func($saludar, "Manuel");
 
call_user_func($saludar, "Manuel");
 
+
// Este código imprimirá: Hola Manuel
 
?>
 
?>
 
</source>
 
</source>
 +
====Acceso a Variables del Entorno: `use` vs. `global`====
 +
 +
* Cuando trabajamos con funciones anónimas en PHP, hay una característica importante sobre cómo acceder a las variables del entorno.
 +
* En PHP, las funciones anónimas ''no tienen acceso directo'' a las variables del entorno en el que se crean.
 +
* Si necesitamos usar esas variables dentro de la función anónima, tenemos dos opciones: ''usar `use` '' o ''declarar las variables como `global`''.
 +
====Uso de `use` para Capturar Variables del Entorno====
 +
* El ''operador `use`'' permite capturar variables del entorno en el momento en que se define la función anónima.
 +
* Esto es útil cuando queremos hacer referencia a valores específicos del entorno externo sin modificarlos (o incluso, modificarlos en algunos casos específicos).
 +
 +
* `use` permite pasar variables del entorno a la función anónima '''por valor''', aunque también es posible pasarlas por referencia si se indica con `&`.
 +
* Cuando usamos `use`, la variable queda "capturada" en el estado en el que estaba al momento de declarar la función anónima.
 +
 +
;Ejemplo con `use`:
 +
 +
<source lang =php>
 +
 +
$mensaje = "Hola";
 +
 +
$mi_funcion = function() use ($mensaje) {
 +
    echo $mensaje;
 +
};
 +
 +
$mi_funcion(); // Imprime: Hola
 +
</source>
 +
* En este ejemplo, '''$mensaje'' se pasa a la función anónima con use y puede ser utilizada dentro de la función.
 +
* Sin embargo, cualquier cambio en ''$mensaje'' dentro de la función no afectará a la variable $mensaje fuera de la función a menos que la pasemos por referencia.
 +
* Para modificar la variable del entorno, podemos hacerlo pasando la variable por referencia con use (&$variable):
 +
<source lang=php>
 +
$contador = 1;
 +
 +
$incrementar = function() use (&$contador) {
 +
    $contador++;
 +
};
 +
 +
$incrementar();
 +
echo $contador; // Imprime: 2
 +
</source>
 +
* En este ejemplo, ''$contador'' se pasa por referencia a la función anónima, por lo que cualquier modificación dentro de la función afectará también al valor de $contador fuera de ella.

Última revisión de 19:13 5 nov 2024

Funciones Anónimas




Icon define.gif
¿Qué son?
Son funciones que no tienen nombre.
También se conocen como funciones de clausura o funciones cierre. En PHP, las funciones anónimas implementan la clase `Closure` ([documentación de Closure](https://www.php.net/manual/es/class.closure.php)).
Para crear una función anónima en PHP, se usa la siguiente estructura
function () {
    return "Hola desde una función anónima";
};




Icon qmark.gif
Pregunta
Puede parecer paradójico, pero ¿para qué sirve una función anónima y cómo podemos invocarla?



En PHP, existen dos formas principales de invocar una función anónima
1. A través de variables de función.
2. Como argumento en otra función. Es decir, pasamos la función anónima como parámetro a otra función.

Variables de Función

  • En PHP, podemos asignar una función anónima a una variable y luego invocar la función a través de esa variable. Esta técnica permite trabajar con funciones de forma similar a las variables, lo que puede ser cómodo en ciertos casos.
  • Usar variables de función requiere tener presente que no podemos invocar la función antes de la asignación, ya que hasta ese punto, la función no existe en la variable.
  • Para asignar una función anónima a una variable, simplemente declaramos la variable y le asignamos la función. Para invocarla, solo tenemos que llamar a la variable como si fuera una función, usando paréntesis `()`.
<?php
$mi_funcion = function () {
    return "hola caracola";
};
 
echo $mi_funcion(); // Imprime: hola caracola
?>
  • Si intentamos invocar la función antes de asignarla a la variable, obtendremos un error.*
// Error: La función no existe antes de la asignación
echo $mi_funcion();
 
$mi_funcion = function () {
    return "hola caracola";
};

Comparación con Funciones Nombradas

En cambio, si usáramos una función nombrada en lugar de una función anónima, PHP podría procesarla sin importar el orden, debido a su interpretación en dos pasadas:

<?php
echo mi_funcion(); // Esto funcionará debido a la doble pasada de PHP
 
function mi_funcion() {
    return "hola caracola";
}
?>

Pasar Funciones Anónimas como Parámetros en Otras Funciones

  • Otra manera de usar funciones anónimas es pasarlas como parámetros en otras funciones. En PHP, hay varias funciones del sistema que aceptan una función de clausura como argumento. Al usar funciones anónimas en estos casos, podemos crear lógica personalizada que se ejecuta en el contexto de la función de nivel superior.

Algunos ejemplos de funciones del sistema que aceptan funciones de clausura como argumentos son: - [`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)

Uso de `call_user_func` para Invocar Funciones Anónimas

  • Otra forma de invocar una función anónima es mediante la función `call_user_func`. Esta función acepta una función anónima como primer argumento y, opcionalmente, otros argumentos que serán pasados a la función anónima.
<?php
call_user_func(function ($nombre) {
    echo "Hola $nombre";
}, "Manuel");
// Este código imprimirá: Hola Manuel
?>

Mejorar la Legibilidad Usando Variables

  • En lugar de escribir la función anónima directamente en call_user_func, podemos asignarla a una variable para mejorar la legibilidad del código.
<?php
$saludar = function ($nombre) {
    echo "Hola $nombre";
};
 
call_user_func($saludar, "Manuel");
// Este código imprimirá: Hola Manuel
?>

Acceso a Variables del Entorno: `use` vs. `global`

  • Cuando trabajamos con funciones anónimas en PHP, hay una característica importante sobre cómo acceder a las variables del entorno.
  • En PHP, las funciones anónimas no tienen acceso directo a las variables del entorno en el que se crean.
  • Si necesitamos usar esas variables dentro de la función anónima, tenemos dos opciones: usar `use` o declarar las variables como `global`.

Uso de `use` para Capturar Variables del Entorno

  • El operador `use` permite capturar variables del entorno en el momento en que se define la función anónima.
  • Esto es útil cuando queremos hacer referencia a valores específicos del entorno externo sin modificarlos (o incluso, modificarlos en algunos casos específicos).
  • `use` permite pasar variables del entorno a la función anónima por valor, aunque también es posible pasarlas por referencia si se indica con `&`.
  • Cuando usamos `use`, la variable queda "capturada" en el estado en el que estaba al momento de declarar la función anónima.
Ejemplo con `use`
$mensaje = "Hola";
 
$mi_funcion = function() use ($mensaje) {
    echo $mensaje;
};
 
$mi_funcion(); // Imprime: Hola
  • En este ejemplo, '$mensaje se pasa a la función anónima con use y puede ser utilizada dentro de la función.
  • Sin embargo, cualquier cambio en $mensaje dentro de la función no afectará a la variable $mensaje fuera de la función a menos que la pasemos por referencia.
  • Para modificar la variable del entorno, podemos hacerlo pasando la variable por referencia con use (&$variable):
$contador = 1;
 
$incrementar = function() use (&$contador) {
    $contador++;
};
 
$incrementar();
echo $contador; // Imprime: 2
  • En este ejemplo, $contador se pasa por referencia a la función anónima, por lo que cualquier modificación dentro de la función afectará también al valor de $contador fuera de ella.