6.34 Fonctions
6 Index des fonctions
Manuel PHP
. Introduction . Pré-requis . Installation . Configuration à l'exécution . Constantes Prédefinies . call_user_func_array . call_user_func ->create_function . func_get_arg . func_get_args . func_num_args . function_exists . get_defined_functions . register_shutdown_function . register_tick_function . unregister_tick_function
|
6.34.8 create_function()Crée une fonction anonyme (style lambda)[ Exemples avec create_function ] PHP 4 >= 4.0.1
string
create_function (
string
args
,
string
code
)
create_function
crée une fonction anonyme,
à partir des paramètres passés, et retourne
un nom de fonction unique. 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 proteger
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
).
Vous pouvez utiliser cette fonction pour (par exemple) créer
une fonction à partir d'informations récoltés
durant l'éxécution.
| Création d'une fonction anonyme avec create_function |
<?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.
| Traitement générique par fonction avec create_function |
<?php function process($var1, $var2, $farr) { for ($f=0; $f < count($farr); $f++) echo $farr[$f]($var1,$var2)."\n"; } // création d'une série de fonction 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 fonction sur chaîne de caractères $garr = array( create_function('$b,$a','if (strncmp($a,$b,3) == 0) return "** \"$a\" '. 'et \"$b\"\n** Ces chaînes de ressemblent!! (regarde les trois premiers caractères)";'), 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 secondes liste de fonctions anonymes\n"; process("Twas brilling and the slithy toves", "Twas the night", $garr); ?>
|
Et lorsque vous utilisez le code ci-dessus, l'affichage va être
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" et "Twas brilling and the slithy toves" ** Ces chaînes de ressemblent!! (regarde les trois premiers caractères) CRCs: -725381282 , 1908338681 similarité(a,b) = 11(45.833333333333%)
|
Mais l'utilisation la plus courante des fonctions lambda est la
fonction de callback, par exemple lors de l'utilisation de
array_walk
ou
usort
| Utilisation de fonctions anonymes comme fonction de callback |
<?php $av = array("la ","une ","cette ","une certaine "); array_walk($av, create_function('&$v,$k','$v = $v."maison";')); print_r($av); // En PHP 3 utilisez <A HREF="function.var-dump.html"><TT>var_dump</TT></a>
// affiche: // Array // ( // [0] => la maison // [1] => une maison // [2] => cette maison // [3] => une certaine maison // ) // un tableau de chaîne classé par taille $sv = array("petite","moyenne","tres longue","vraiment tres longue"); print_r($sv); // affiche: // Array // ( // [0] => petite // [1] => moyenne // [2] => tres longue // [3] => vraiment tres longue // ) // Tri par ordre de taille décroissant usort($sv, create_function('$a,$b','return strlen($b) - strlen($a);')); print_r($sv); // outputs: // Array // ( // [0] => vraiment tres longue // [1] => tres longue // [2] => moyenne // [3] => petite // ) ?>
|
|