(PHP 4 >= 4.0.1, PHP 5, PHP 7)
create_function — Erzeugen einer anonymen (Lambda-Stil) Funktion
$args
, string $code
)Erzeugt eine anonyme Funktion anhand der übergebenen Parameter und gibt einen eindeutigen Namen für diese zurück.
Diese Funktion führt intern eval() aus und hat daher die gleichen Sicherheitsprobleme die eval() hat. Außerdem zeigt diese Funktion schlechtes Verhalten in anbetracht von Ausführungsgeschwindigkeit und Speicherverbrauch.
Wenn Sie PHP 5.3.0 oder neuer einsetzen sollten Sie stattdessen die nativ vorhandenen anonymen Funktionen verwenden.
Normalerweise werden die Parameter als mit einfachen Anführungszeichen begrenzte Strings übergeben. Der Grund für die Verwendung von einfachen Anführungszeichen ist der Schutz der Variablen vor dem Parsen. Falls sie doppelte Anführungszeichen verwenden, müssen sie die Variablen-Namen escapen, wie z.B. \$avar.
args
Die Funktionsparameter.
code
Der Code der Funktion.
Gibt einen eindeutigen Funktionsnamen als String oder FALSE
im Fehlerfall zurück.
Beispiel #1 Erzeugen einer anonymen Funktion per create_function()
Dieser Befehl kann z.B. verwendet werden, um eine Funktion anhand von Informationen zu erzeugen, die erst zur Laufzeit vorliegen.
<?php
$newfunc = create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);');
echo "Neue anonyme Funktion: $newfunc\n";
echo $newfunc(2, M_E) . "\n";
// Ausgabe:
// Neue anonyme Funktion: lambda_1
// ln(2) + ln(2.718281828459) = 1.6931471805599
?>
Sie können auch eine allgemeine Handler-Funktion erstellen, die einen mehr oder weniger große Anzahl an Operationen mit einer Liste von Parametern durchführt:
Beispiel #2 Erzeugung einer generellen Bearbeitungsfunktion mit create_function()
<?php
function process($var1, $var2, $farr)
{
foreach ($farr as $f) {
echo $f($var1, $var2) . "\n";
}
}
// Nun erzeugen wir eine Sammlung von mathematischen Funktionen
$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 "etwas Trigonometrie: ".(sin($x) + $x*cos($y));'),
create_function('$x,$y', 'return "eine Hypotenuse: ".sqrt($x*$x + $y*$y);'),
create_function('$a,$b', $f1),
create_function('$a,$b', $f2),
create_function('$a,$b', $f3)
);
echo "\nWir benutzen nun das erste Array mit anonymen Funktionen\n";
echo "Parameter: 2.3445, M_PI\n";
process(2.3445, M_PI, $farr);
// Nun erzeugen wir eine Sammlung von Funktionen zur Bearbeitung von Zeichenketten
$garr = array(
create_function('$b,$a', 'if (strncmp($a, $b, 3) == 0) return "** \"$a\" '.
'und \"$b\"\n** Sehen für mich ähnlich aus! (unter Betrachtung der ersten 3 Zeichen)";'),
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 "\nWir benutzen nun das zweite Array mit anonymen Funktionen\n";
process("Twas brilling and the slithy toves", "Twas the night", $garr);
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
Wir benutzen nun das erste Array mit anonymen Funktionen Parameter: 2.3445, M_PI etwas Trigonometrie: -1.6291725057799 eine Hypotenuse: 3.9199852871011 b*a^2 = 4.8103313314525 min(b^2+a, a^2,b) = 8.6382729035898 ln(a)/b = 0.27122299212594 Wir benutzen nun das zweite Array mit anonymen Funktionen ** "Twas the night" und "Twas brilling and the slithy toves" ** Sehen für mich ähnlich aus! (unter Betrachtung der ersten 3 Zeichen) CRCs: -725381282, 342550513 similar(a,b) = 11(45.833333333333%)
Aber wahrscheinlich liegt der häufigste Anwendungsfall für Funktionen im Lambda-Stil (anonym) bei den Callback-Funktionen, also z.B. beim Gebrauch von array_walk() oder usort().
Beispiel #3 Gebrauch der anonymen Funktionen als Callback-Funktion
<?php
$av = array("the ", "a ", "that ", "this ");
array_walk($av, create_function('&$v,$k', '$v = $v . "mango";'));
print_r($av);
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
Array ( [0] => the mango [1] => a mango [2] => that mango [3] => this mango )
Ein Array con Zeichenketten sortiert von der kürzesten zur längsten
<?php
$sv = array("small", "larger", "a big string", "it is a string thing");
print_r($sv);
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
Array ( [0] => small [1] => larger [2] => a big string [3] => it is a string thing )
Sortiert von der Längsten zur Kürzesten
<?php
usort($sv, create_function('$a,$b','return strlen($b) - strlen($a);'));
print_r($sv);
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
Array ( [0] => it is a string thing [1] => a big string [2] => larger [3] => small )