02-12-2020

Pasar una función como parámetro de otra función en php

Hace un tiempo expliqué en un post como funcionan las funciones anónimas en php y ahora quiero comentaros como pasar una funcion como parámetro de otra función en php y la verdad es que es bastante sencillo.
Primero voy a poner un ejemplo usando funciones anónimas:
$suma = function ($a,$b){
return $a + $b;
};

$resta = function ($a,$b){
return $a - $b;
};

function operacion($function,$a,$b){
  echo $function($a,$b);
}

operacion($resta,5,3);
operacion($suma,5,3);
En este primer ejemplo se puede ver que se crean las funciones anónimas "suma" y "resta" que tienen dos parámetros. Lo que también permite php es crear una función y pasar como argumento el nombre de dicha función.

function multiplicacion($a,$b){

return $a * $b;

}

function operacion($function,$a,$b){
  echo $function($a,$b);
}

operacion('multiplicacion',5,3);
En este segundo ejemplo se puede ver que se crea la función "multiplicacioon" y que se usa la funcion "operacion" como en el primer ejemplo.
Pero ¿cómo se comprueba que un literal es el nombre de una función o que una variable es una función anónima? Preguntándole a php si es callable usando "is_callable".
Usando los ejemplos anteriores:

var_dump(is_callable($resta)); //Devolvería true
var_dump(is_callable('multiplicacion')); //Devolvería true
var_dump(is_callable('suma')); //Devolvería false pq no existe la función suma sino la variable $suma que es una función anónima.
Para el caso de las funciones anónimas no se puede usar la comprobación "function_exists" que en el caso de la función "multiplicacion" devolvería "true".
Gracias a php 7 podemos decirle, a la función "operacion" que el argumento "$function" es una función simplemente indicando que el tipo es "callable"

function operacion(callable $function,$a,$b){
  echo $function($a,$b).'
'; }