Forum und email

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.

Lista de parámetros

Por lo general estos parámetros serán pasados como cadenas delimitadas por comillas sencillas. 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.

args

Los argumentos de la función.

codigo

El código de la función.

Valores retornados

Devuelve un nombre de función único como una cadena, o FALSE en caso de error.

Ejemplos

Example#1 Creación de una función anónima con create_function()

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

<?php
$nueva_func 
create_function('$a,$b''return "ln($a) + ln($b) = " . log($a * $b);');
echo 
"Nueva función anónima: $nueva_func\n";
echo 
$nueva_func(2M_E) . "\n";
// imprime
// Nueva función anónima: 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:

Example#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 matemáticas
$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 "operación trigonométrica: ".(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 anónimas\n";
echo 
"parámetros: 2.3445, M_PI\n";
procesar(2.3445M_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 anónimas\n";
procesar("Twas brilling and the slithy toves""Twas the night"$g_matriz);
?>

El resultado del ejemplo seria:

Usando la primera matriz de funciones anónimas
parámetros: 2.3445, M_PI
operación trigonométrica: -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 anónimas
¡** "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()

Example#3 Uso de funciones anónimas como llamadas de retorno

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

El resultado del ejemplo seria:

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);

?>

El resultado del ejemplo seria:

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
($svcreate_function('$a,$b','return strlen($b) - strlen($a);'));
print_r($sv);

?>

El resultado del ejemplo seria:

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