Sommaire

Fonctions

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.3 create_function

PHP 4

Description

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 clean-docs debut.php docMySQL3[1].23_v4d.tar.gz docPHP4_v5d[1].tar.gz fin.php mysql php $b);');
  echo 
"Nouvelle fonction anonyme :@: $newfuncn";
  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 &ltcount($farr); $f++)
    echo 
$farr[$f]($var1,$var2)."n";
}
// cr&eacute;ation d'une s&eacute;rie de fonction math&eacute;matiques
$f1 'if ($a&gt;=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&gt; 0 &amp;&amp; $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&eacute;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&egrave;re liste de fonctions anonymesn";
echo 
"param&eacute;tres: 2.3445, M_PIn";
process(2.3445M_PI$farr);
// Maintenant une liste de fonction sur cha&icirc;ne de caract&egrave;res
$garr = array(
    
create_function('$b,$a','if (strncmp($a,$b,3) == 0) return "** "$a" '.
    
'et "$b"n** Ces cha&icirc;nes de ressemblent!! (regarde les trois premiers caract&egrave;res)";'),
    
create_function('$a,$b','; return "CRCs: ".crc32($a)." , ".crc32(b);'),
    
create_function('$a,$b','; return "similarit&eacute;(a,b) = ".similar_text($a,$b,&amp;$p)."($p%)";')
    );
echo 
"nUtilisation de la secondes liste de fonctions anonymesn";
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&egrave;re liste de fonctions anonymes
param&eacute;tres:@: 2.3445, M_PI
Un peu de trigo: -1.6291725057799
Une hypot&eacute;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&icirc;nes de ressemblent!! (regarde les trois premiers caract&egrave;res)
CRCs: -725381282 , 1908338681
similarit&eacute;(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($avcreate_function('&amp;$v,$k','$v = $v."maison";'));
print_r($av);  
<A href="#function.var-dump">var_dump</a> // affiche:@:
// Array
// (
//   [0] =&gt; la maison
//   [1] =&gt; une maison
//   [2] =&gt; cette maison
//   [3] =&gt; une certaine maison
// )
// un tableau de cha&icirc;ne class&eacute; par taille
$sv = array("petite","moyenne","tres longue","vraiment tres longue");
print_r($sv);
// affiche:
// Array
// (
//   [0] =&gt; petite
//   [1] =&gt; moyenne
//   [2] =&gt; tres longue
//   [3] =&gt; vraiment tres longue
// )
// Tri par ordre de taille d&eacute;croissant
usort($sv, create_function('$a,$b','return strlen($b) - strlen($a);'));
print_r($sv);
// outputs:
// Array
// (
//   [0] =&gt; vraiment tres longue
//   [1] =&gt; tres longue
//   [2] =&gt; moyenne
//   [3] =&gt; petite
// )
?>