(PHP 4 >= 4.0.1, PHP 5, PHP 7)
create_function — Crea una función anónima
Esta función ha sido declarada OBSOLETA a partir de PHP 7.2.0, y será ELIMINADA a partir de PHP 8.0.0. Su uso está totalmente desaconsejado.
create_function() crea una función anónima, a partir de los argumentos pasados, y devuelve un nombre de función único.
Esta función, internamente, utiliza la función eval() y por lo tanto los requisitos de seguridad son idénticos a los de la función eval(). Además, el rendimiento no es óptimo y el uso de memoria es significativo.
Una función anónima nativa debería ser utilizada en su lugar.
Generalmente, los argumentos args
son
presentados en forma de una cadena entre comillas simples, y la misma
recomendación aplica para code
.
La razón de usar comillas simples es proteger
los nombres de variables del reemplazo por su valor. Si se usan
comillas dobles, no se olvide de escapar
los nombres de variables (i.e. \$avar
).
args
Los argumentos de la función.
code
El código de la función.
Devuelve un nombre de función único, en forma de una chaîne de caractères,
o false
si ocurre un error.
Ejemplo #1 Creación de una función anónima con create_function()
Esta función puede ser utilizada para (por ejemplo) crear una función a partir de información recolectada durante la ejecución:
<?php
$newfunc = create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);');
echo "Nueva función anónima: $newfunc\n";
echo $newfunc(2, M_E) . "\n";
// mostrará:
// Nueva función anónima: lambda_1
// ln(2) + ln(2.718281828459) = 1.6931471805599
?>
O, para poder aplicar una función genérica a una lista de argumentos.
Ejemplo #2 Procesamiento genérico por función con create_function()
<?php
function process($var1, $var2, $farr)
{
foreach ($farr as $f) {
echo $f($var1, $var2) . "\n";
}
}
// Creación de una serie 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; }';
$farr = array(
create_function('$x,$y', 'return "un poco de trigonometría: ".(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 "\nUso de la primera lista de funciones anónimas\n";
echo "parámetros: 2.3445, M_PI\n";
process(2.3445, M_PI, $farr);
// Ahora una lista de funciones sobre cadenas de caracteres
$garr = array(
create_function('$b,$a', 'if (strncmp($a, $b, 3) == 0) return "** \"$a\" '.
'and \"$b\"\n** Look the same to me! (looking at the first 3 chars)";'),
create_function('$a,$b', '; return "CRCs: " . crc32($a) . ", ".crc32($b);'),
create_function('$a,$b', '; return "similaridad (a,b) = " . similar_text($a, $b, &$p) . "($p%)";')
);
echo "\nUso de la segunda lista de funciones anónimas\n";
process("Twas brilling and the slithy toves", "Twas the night", $garr);
?>
El resultado del ejemplo sería:
Uso de la primera lista de funciones anónimas parámetros: 2.3445, M_PI un poco de trigonometría: -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 Uso de la segunda lista de funciones anónimas ** "Twas the night" and "Twas brilling and the slithy toves" ** Estas cadenas se parecen! (mirando los tres primeros caracteres) CRCs: -725381282, 342550513 similaridad (a,b) = 11(45.833333333333%)
Pero el uso más común de las funciones lambda es la función de devolución de llamada, por ejemplo, al utilizar array_walk() o usort()
Ejemplo #3 Uso de funciones anónimas como función de devolución de llamada
<?php
$av = array("la ", "una ", "cette ", "une certaine ");
array_walk($av, create_function('&$v,$k', '$v = $v . "maison";'));
print_r($av);
?>
El resultado del ejemplo sería:
Array ( [0] => la maison [1] => une maison [2] => cette maison [3] => une certaine maison )
un array de cadenas de caracteres ordenadas de la más corta a la más larga
<?php
$sv = array("petite", "longue", "une très longue chaîne", "une phrase toute entière");
print_r($sv);
?>
El resultado del ejemplo sería:
Array ( [0] => petite [1] => longue [2] => une très longue chaîne [3] => une phrase toute entière )
ordenadas de la más larga a la más corta
<?php
usort($sv, create_function('$a,$b','return strlen($b) - strlen($a);'));
print_r($sv);
?>
El resultado del ejemplo sería:
Array ( [0] => une phrase toute entière [1] => une très longue chaîne [2] => longue [3] => petite )