(PHP 4 >= 4.0.1, PHP 5, PHP 7)
create_function — Crée une fonction anonyme
Cette fonctionnalité est OBSOLÈTE à partir de PHP 7.2.0 et a été SUPPRIMÉE à partir de PHP 8.0.0.
create_function() crée une fonction anonyme, à partir des paramètres passés, et retourne un nom de fonction unique.
Cette fonction, en interne, utilise la fonction eval() et donc les exigences en termes de sécurité sont identiques à celles de la fonction eval(). De plus, les performances ne sont pas au rendez-vous et l'usage mémoire est significatif.
Une fonction anonyme native devrait être utilisée à la place.
Généralement, les arguments args sont
présentés sous la forme d'une chaîne à guillemets simples, et la même
recommandation vaut pour code.
La raison de l'utilisation des guillemets simples est de protéger
les noms de variables du remplacement par leur valeur. Si l'on utilise
les guillemets doubles, n'oubliez pas d'échapper les noms
de variables (c.-à-d. \$avar).
argsLes arguments de la fonction, sous forme d'une seule chaîne séparée par des virgules.
codeLe code de la fonction.
Retourne un nom de fonction unique, sous la forme d'une chaîne de caractères,
ou false si une erreur survient. Il est à noter que le nom contient
un caractère non imprimable ("\0"), il faut donc
faire attention lors de l'affichage du nom ou de son incorporation dans
une autre chaîne.
Exemple #1 Création d'une fonction dynamique avec create_function() ou les fonctions anonymes
Il est possible d'utiliser une fonction créée dynamiquement pour (par exemple) créer une fonction à partir d'informations récoltées durant l'exécution. D'abord, en utilisant create_function() :
<?php
$newfunc = create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);');
echo $newfunc(2, M_E) . "\n";
?>Maintenant le même code, en utilisant une fonction anonyme ; il est à noter que le code et les arguments ne sont plus contenus dans des chaînes :
<?php
$newfunc = function($a,$b) { return "ln($a) + ln($b) = " . log($a * $b); };
echo $newfunc(2, M_E) . "\n";
?>L'exemple ci-dessus va afficher :
ln(2) + ln(2.718281828459) = 1.6931471805599
Exemple #2 Traitement générique par fonction avec create_function() ou les fonctions anonymes
Une autre utilisation pourrait être d'avoir une fonction de traitement générique qui peut appliquer un ensemble d'opérations à une liste de paramètres :
<?php
function process($var1, $var2, $farr)
{
foreach ($farr as $f) {
echo $f($var1, $var2) . "\n";
}
}
// Création d'une série de fonctions mathématiques
$farr = array(
create_function('$x,$y', 'return "un peu de trigo : ".(sin($x) + $x*cos($y));'),
create_function('$x,$y', 'return "une hypoténuse : ".sqrt($x*$x + $y*$y);'),
create_function('$a,$b', 'if ($a >=0) {return "b*a^2 = ".$b*sqrt($a);} else {return false;}'),
create_function('$a,$b', "return \"min(b^2+a, a^2,b) = \".min(\$a*\$a+\$b,\$b*\$b+\$a);"),
create_function('$a,$b', 'if ($a > 0 && $b != 0) {return "ln(a)/b = ".log($a)/$b; } else { return false; }')
);
echo "\nUtilisation de la première liste de fonctions anonymes\n";
echo "paramètres : 2.3445, M_PI\n";
process(2.3445, M_PI, $farr);
// Maintenant une liste de fonctions sur chaîne de caractères
$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 "similar(a,b) = " . similar_text($a, $b, $p) . "($p%)";')
);
echo "\nUtilisation de la seconde liste de fonctions anonymes\n";
process("Twas brilling and the slithy toves", "Twas the night", $garr);
?>Encore une fois, voici le même code en utilisant les fonctions anonymes. Il est à noter que les noms de variables dans le code n'ont plus besoin d'être échappés, car ils ne sont plus inclus dans une chaîne.
<?php
function process($var1, $var2, $farr)
{
foreach ($farr as $f) {
echo $f($var1, $var2) . "\n";
}
}
// Création d'une série de fonctions mathématiques
$farr = array(
function($x,$y) { return "un peu de trigo : ".(sin($x) + $x*cos($y)); },
function($x,$y) { return "une hypoténuse : ".sqrt($x*$x + $y*$y); },
function($a,$b) { if ($a >=0) {return "b*a^2 = ".$b*sqrt($a);} else {return false;} },
function($a,$b) { return "min(b^2+a, a^2,b) = " . min($a*$a+$b, $b*$b+$a); },
function($a,$b) { if ($a > 0 && $b != 0) {return "ln(a)/b = ".log($a)/$b; } else { return false; } }
);
echo "\nUtilisation de la première liste de fonctions anonymes\n";
echo "paramètres : 2.3445, M_PI\n";
process(2.3445, M_PI, $farr);
// Maintenant une liste de fonctions sur chaîne de caractères
$garr = array(
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)"; },
function($a,$b) { return "CRCs: " . crc32($a) . ", ".crc32($b); },
function($a,$b) { return "similar(a,b) = " . similar_text($a, $b, $p) . "($p%)"; }
);
echo "\nUtilisation de la seconde liste de fonctions anonymes\n";
process("Twas brilling and the slithy toves", "Twas the night", $garr);
?>L'exemple ci-dessus va afficher :
Utilisation de la première liste de fonctions anonymes paramètres : 2.3445, M_PI un peu de trigo : -1.6291725057799 une hypoténuse : 3.9199852871011 b*a^2 = 4.8103313314525 min(b^2+a, a^2,b) = 8.6382729035898 ln(a)/b = 0.27122299212594 Utilisation de la seconde liste de fonctions anonymes ** "Twas the night" and "Twas brilling and the slithy toves" ** Look the same to me! (looking at the first 3 chars) CRCs: 3569586014, 342550513 similar(a,b) = 11(45.833333333333%)
Exemple #3 Utilisation de fonctions dynamiques comme fonction de rappel
L'utilisation la plus courante des fonctions dynamiques est probablement de les passer comme fonctions de rappel, par exemple lors de l'utilisation de array_walk() ou usort().
<?php
$av = array("la ", "une ", "cette ", "une certaine ");
array_walk($av, create_function('&$v,$k', '$v = $v . "maison";'));
print_r($av);
?>Conversion en fonction anonyme :
<?php
$av = array("la ", "une ", "cette ", "une certaine ");
array_walk($av, function(&$v,$k) { $v = $v . "maison"; });
print_r($av);
?>L'exemple ci-dessus va afficher :
Array ( [0] => la maison [1] => une maison [2] => cette maison [3] => une certaine maison )
Tri de chaînes de la plus longue à la plus courte avec create_function() :
<?php
$sv = array("petite", "une longue chaîne", "longue", "une phrase toute entière");
echo "Original :\n";
print_r($sv);
echo "Trié :\n";
usort($sv, create_function('$a,$b','return strlen($b) - strlen($a);'));
print_r($sv);
?>Conversion en fonction anonyme :
<?php
$sv = array("petite", "une longue chaîne", "longue", "une phrase toute entière");
echo "Original :\n";
print_r($sv);
echo "Trié :\n";
usort($sv, function($a,$b) { return strlen($b) - strlen($a); });
print_r($sv);
?>L'exemple ci-dessus va afficher :
Original : Array ( [0] => petite [1] => une longue chaîne [2] => longue [3] => une phrase toute entière ) Trié : Array ( [0] => une phrase toute entière [1] => une longue chaîne [2] => longue [3] => petite )