create_function

(PHP 4 >= 4.0.1, PHP 5, PHP 7)

create_functionCrée une fonction anonyme

Avertissement

Cette fonctionnalité est OBSOLÈTE à partir de PHP 7.2.0 et a été SUPPRIMÉE à partir de PHP 8.0.0.

Description

create_function(string $args, string $code): string

create_function() crée une fonction anonyme, à partir des paramètres passés, et retourne un nom de fonction unique.

Attention

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.

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 l'on utilise les guillemets doubles, n'oubliez pas d'échapper les noms de variables (c.-à-d. \$avar).

args

Les arguments de la fonction, sous forme d'une seule chaîne séparée par des virgules.

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

Exemples

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
)

Voir aussi