create_function
(PHP 4 >= 4.0.1, PHP 5, PHP 7)
create_function — Crée une fonction anonyme
Cette fonction est devenue OBSOLETE depuis PHP 7.2.0. Nous vous encourageons vivement à ne plus l'utiliser.
Description
$args
, string $code
)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 terme 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.
Si vous utilisez PHP 5.3.0 ou supérieur, une fonction anonyme native doit être utilisée à la place.
Liste de paramètres
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 vous utilisez
les guillemets doubles, n'oubliez pas d'échapper les noms
de variables (i.e. \$avar).
-
args
-
Les arguments de la fonction.
-
code
-
Le code de la fonction.
Valeurs de retour
Retourne un nom de fonction unique, sous la forme d'une chaîne de caractères,
ou FALSE
si une erreur survient.
Exemples
Exemple #1 Création d'une fonction anonyme avec create_function()
Vous pouvez utiliser cette fonction pour (par exemple) créer une fonction à partir d'informations récoltées durant l'exécution :
<?php
$newfunc = create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);');
echo "Nouvelle fonction anonyme : $newfunc\n";
echo $newfunc(2, M_E) . "\n";
// affichera :
// Nouvelle fonction anonyme : lambda_1
// ln(2) + ln(2.718281828459) = 1.6931471805599
?>
Ou, pour pouvoir appliquer une fonction générique à une liste d'arguments.
Exemple #2 Traitement générique par fonction avec create_function()
<?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
$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 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', $f1),
create_function('$a,$b', $f2),
create_function('$a,$b', $f3)
);
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 "similarité (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" ** Ces chaînes se ressemblent ! (regardez les trois premiers caractères) CRCs: -725381282, 342550513 similarité (a,b) = 11(45.833333333333%)
Mais l'utilisation la plus courante des fonctions lambda est la fonction de rappel, par exemple, lors de l'utilisation de array_walk() ou usort()
Exemple #3 Utilisation de fonctions anonymes comme fonction de rappel
<?php
$av = array("la ", "une ", "cette ", "une certaine ");
array_walk($av, create_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 )
un tableau de chaînes de caractères ordonnées de la plus courte à la plus longue
<?php
$sv = array("petite", "longue", "une très longue chaîne", "une phrase toute entière");
print_r($sv);
?>
L'exemple ci-dessus va afficher :
Array ( [0] => petite [1] => longue [2] => une très longue chaîne [3] => une phrase toute entière )
ordonnées de la plus longue à la plus courte
<?php
usort($sv, create_function('$a,$b','return strlen($b) - strlen($a);'));
print_r($sv);
?>
L'exemple ci-dessus va afficher :
Array ( [0] => une phrase toute entière [1] => une très longue chaîne [2] => longue [3] => petite )
Document créé le 30/01/2003, dernière modification le 26/10/2018
Source du document imprimé : https://www.gaudry.be/php-rf-function.create-function.html
L'infobrol est un site personnel dont le contenu n'engage que moi. Le texte est mis à disposition sous licence CreativeCommons(BY-NC-SA). Plus d'info sur les conditions d'utilisation et sur l'auteur.
Références
Ces références et liens indiquent des documents consultés lors de la rédaction de cette page, ou qui peuvent apporter un complément d'information, mais les auteurs de ces sources ne peuvent être tenus responsables du contenu de cette page.
L'auteur de ce site est seul responsable de la manière dont sont présentés ici les différents concepts, et des libertés qui sont prises avec les ouvrages de référence. N'oubliez pas que vous devez croiser les informations de sources multiples afin de diminuer les risques d'erreurs.