create_function

(PHP 4 >= 4.0.1, PHP 5)

create_function -- Crear una función anónima (estilo-lambda)

Descripción

string create_function ( string args, string codigo )

Crea una función anónima con los parámetros pasados, y devuelve un nombre único para ella. Por lo general los args serán pasados como una cadena delimitada por comillas sencillas, y esto es recomendable también para el codigo. La razón para usar cadenas entre comillas sencillas es evitar que los nombres de variables sean interpretados, de otro modo, si usa comillas dobles será necesario escapar los nombres de variables, p.ej. \$una_var.

Es posible usar esta función para (por ejemplo) crear una función a partir de información recogida en tiempo de ejecución:

Ejemplo 1. Creación de una función anónima con create_function()

<?php
$nueva_func
= create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);');
echo
"Nueva funcion anonima: $nueva_func\n";
echo
$nueva_func(2, M_E) . "\n";
// imprime
// Nueva funcion anonima: lambda_1
// ln(2) + ln(2.718281828459) = 1.6931471805599
?>

O, quizás para tener una función de gestión general que pueda aplicar un conjunto de operaciones a una lista de parámetros:

Ejemplo 2. Creación de una función general de procesamiento con create_function()

<?php
function procesar($var1, $var2, $f_matriz)
{
    foreach (
$f_matriz as $f) {
        echo
$f($var1, $var2) . "\n";
    }
}

// crear un grupo de funciones matematicas
$f1 = 'if ($a >=0) {return "b*a^2 = ".$b*sqrt($a);} else {return false;}';
$f2 = "return \"min(b^2+a, a^2,b) = \".min(\$a*\$a+\$b,\$b*\$b+\$a);";
$f3 = 'if ($a > 0 && $b != 0) {return "ln(a)/b = ".log($a)/$b; } else { return false; }';
$f_matriz = array(
    
create_function('$x,$y', 'return "operacion trigonometrica: ".(sin($x) + $x*cos($y));'),
    
create_function('$x,$y', 'return "una hipotenusa: ".sqrt($x*$x + $y*$y);'),
    
create_function('$a,$b', $f1),
    
create_function('$a,$b', $f2),
    
create_function('$a,$b', $f3)
    );

echo
"\nUsando la primera matriz de funciones anonimas\n";
echo
"parametros: 2.3445, M_PI\n";
procesar(2.3445, M_PI, $f_matriz);

// ahora crear un grupo de funciones de procesamiento de cadenas
$g_matriz = array(
    
create_function('$b,$a', 'if (strncmp($a, $b, 3) == 0) return "** \"$a\" '.
    
'y \"$b\"\n** lucen igual! (mirando los 3 primeros caracteres)";'),
    
create_function('$a,$b', '; return "CRCs: " . crc32($a) . " , ".crc32(b);'),
    
create_function('$a,$b', '; return "similar(a,b) = " . similar_text($a, $b, &$p) . "($p%)";')
    );
echo
"\nUsando la segunda matriz de funciones anonimas\n";
procesar("Twas brilling and the slithy toves", "Twas the night", $g_matriz);
?>

y cuando ejecute el código anterior, la salida será:

Usando la primera matriz de funciones anonimas
parametros: 2.3445, M_PI
operacion trigonometrica: -1.6291725057799
una hipotenusa: 3.9199852871011
b*a^2 = 4.8103313314525
min(b^2+a, a^2,b) = 8.6382729035898
ln(a/b) = 0.27122299212594

Usando la segunda matriz de funciones anonimas
** "Twas the night" y "Twas brilling and the slithy toves"
** lucen igual! (mirando los 3 primeros caracteres)
CRCs: -725381282 , 1908338681
similar(a,b) = 11(45.833333333333%)

Pero quizás el uso más común para funciones estilo-lambda (anónimas) es crear llamadas de retorno, por ejemplo cuando se usa array_walk() o usort()

Ejemplo 3. Uso de funciones anónimas como llamadas de retorno

<?php
$av
= array("el ", "un ", "ese ", "este ");
array_walk($av, create_function('&$v,$k', '$v = $v . "mango";'));
print_r($av);
?>

imprime:

Array
(
  [0] => el mango
  [1] => un mango
  [2] => ese mango
  [3] => este mango
)

una matriz de cadenas ordenadas desde la más corta a la más larga

<?php

$sv
= array("corta", "mas larga", "una cadena grande", "es una cosa como una cadena");
print_r($sv);

?>

imprime:

Array
(
    [0] => corta
    [1] => mas larga
    [2] => una cadena grande
    [3] => es una cosa como una cadena
)

ordenarla desde la más larga a la más corta

<?php

usort
($sv, create_function('$a,$b','return strlen($b) - strlen($a);'));
print_r($sv);

?>

imprime:

Array
(
    [0] => es una cosa como una cadena
    [1] => una cadena grande
    [2] => mas larga
    [3] => corta
)