Funciones anónimas en PHP


Lección 16 / 24

Funciones anónimas en PHP

Php Desarrollador Php Curso php

Hasta ahora siempre hemos dado un nombre a nuestras funciones para poder llamarlas; en realidad, sin embargo, los desarrolladores de php saben bien que también hay funciones que no tienen nombre y que, por secuencia en el código (lectura y ejecución de arriba a abajo) tan pronto como se "encuentran" se activan: son las llamadas funciones anónimas.

Las funciones anónimas se crean para cumplir dos propósitos específicos:

  • ser asignado a una variable (y, por tanto, permitirnos llamar a la función utilizando el propio nombre de la variable);

     

  • utilizarse como funciones de callback (es decir, funciones que se utilizan como parámetros reales de otras funciones)

Veamos algunos ejemplos y uso de funciones anónimas:

 

<?php
   $sum = function($a, $b){
     return $a+$b;
   };
     echo $sum(4,5);
?>

En output tendremos como resultado 9, es decir la suma correcta entre los dos números.

La primera observación que podemos hacer es que nuestra función tiene un ";" después del clip de cierre; esto nos dice que lo que hemos escrito es una expresión que será traducida como función y tratada como tal.
En nuestro ejemplo, vimos cómo se podía explotar una función anónima asignándola a una variable, llamándola a través de la propia variable.

Con esta metodología también podemos explotar parámetros externos a la función, dejándolos entrar de una forma diferente a como lo hemos hecho hasta ahora.

<?php
    $num1 = 5;
    $num2 = 12;

    $sum = function() use($num1, $num2){
      return $num1+$num2;
    };
      echo $sum();
?>

En output tendremos como resultado 17, la suma correcta entre los dos números.

Como puedes ver, con la palabra clave "usar" le decimos a la función que use las variables en el alcance externo.

Surge la pregunta: ahora que conocemos esta palabra clave, entonces, ¿podríamos también hacer qué seguir?

<?php
   $num1 = 5;
   $num2 = 12;

   function sum() use($num1, $num2){
     return $num1+$num2;
   }

   sum();
?>

O incluso peor


<?php
   $num1 = 5;
   $num2 = 12;

   function sum(use($num1, $num2)){
     return $num1+$num2;
   }
   sum();
?>

¡La respuesta es absolutamente no!.

En estos casos no podemos usar la palabra clave “use” porque estamos declarando la función a través de la palabra clave “function” y no como una función anónima.
La diferencia entre los dos es que la función es una construcción, la función anónima es una expresión traducida y tratada como una función; solo en el segundo caso podemos usar la palabra clave "usar".

Dijimos que una función anónima se puede usar como una función de callback.
Hay funciones built-in, por ejemplo, que esperan una función de callback como uno de sus parámetros; veamos uno:

Array reduce, de la documentación: array_reduce () iterativamente aplica la función de devolución de llamada a los elementos del array, para reducirla a un solo valor.

"array_reduce(array $array, callable $callback, mixed $initial = null): mixed"

Como vemos, nuestra función espera una función de devolución de llamada como segundo parámetro; por lo tanto, utilizaremos una función anónima (el último parámetro se puede omitir):

<?php
   function sum(...$numbers){

    $result = array_reduce($numbers, function($accumulator, $number){
      return $accumulator += $number;
    });

   return $result;
   }

   $result = sum(3,56,78,6,13,7,89,100,95);
     echo $result;

    //En output tendremos:

    //447 
?>

Hemos construido una función anónima dentro de los parámetros de la función "array_reduce" que deberá seguir reglas muy específicas descritas en la documentación:

"callback(mixed $carry, mixed $item): mixed"

donde "carry" contiene el valor de retorno de la iteración anterior (en el caso de la primera iteración, conserva el valor de initial), mientras que "item" contiene el valor de la iteración actual.

En pocas palabras, carry es nuestro acumulador: una variable que parte de un valor (nulo en nuestro caso) y, de vez en cuando, se actualizará con la suma del artículo, nuestro número $, el único número capturado, en orden de izquierda a derecha, de nuestra matriz de números $ números.

Por lo tanto, no inventamos nuestra función de devolución de llamada anónima de la nada: revisamos la documentación y creamos una función en consecuencia.

¡Atención! ¡Las funciones de devolución de llamada no son necesariamente funciones anónimas!
De hecho, la documentación PHP también cuenta con numerosos ejemplos en los que no se utilizan funciones anónimas. Así que intentemos construir el ejemplo anterior con una función estándar:

<?php
   function callbackFunction($accumulator, $number){

     //return $accumalotor = $accumalotor + $number;

     return $accumulator += $number;

   };
      
   function sum(...$numbers){

     $result = array_reduce($numbers, "callbackFunction");
       return $result;
     }

     $result = sum(3,56,78,6,13,7,89,100,95);

       echo $result;

    //En output tendremos:

    //447
?>

© 2022 Aulab. Todos los derechos reservados • P.IVA: IT07647440721 • Política de privacidad