create_function
(PHP 4 >= 4.0.1, PHP 5, PHP 7)
create_function — Erzeugt eine Funktion dynamisch durch Auswertung einer Zeichenkette mit Code
Diese Funktion ist seit PHP 7.2.0 DEPRECATED (veraltet) und seit PHP 8.0.0 ENTFERNT. Von der Verwendung dieser Funktion wird dringend abgeraten.
Beschreibung
$args
, string $code
): stringErzeugt aus den übergebenen Parametern dynamisch eine Funktion und gibt einen eindeutigen Namen für sie zurück.
Diese Funktion führt intern eval() aus und hat daher die gleichen Sicherheitsprobleme wie eval(). Außerdem zeigt diese Funktion ein schlechtes Verhalten in Bezug auf Leistung und Speicherverbrauch, da die erzeugten Funktionen global sind und nicht mehr freigegeben werden können.
Stattdessen sollten die nativ vorhandenen anonymen Funktionen verwendet werden.
Parameter-Liste
Normalerweise ist es ratsam, diese Parameter als Zeichenketten in
einfachen Anführungszeichen
zu übergeben. Wenn sie in
doppelten Anführungszeichen
übergeben werden, müssen die Variablennamen im Code sorgfältig maskiert
werden, z. B. \$somevar
.
-
args
-
Die Funktionsargumente in Form einer einzelnen durch Komma getrennten Zeichenkette.
-
code
-
Der Code der Funktion.
Rückgabewerte
Gibt einen eindeutigen Funktionsnamen als Zeichenkette zurück.
Bei einem Fehler wird false
zurückgegeben. Es ist zu beachten, dass der Name ein nicht
druckbares Zeichen enthält ("\0"
), weshalb Vorsicht
geboten ist, wenn der Name gedruckt oder in eine andere Zeichenkette
eingefügt werden soll.
Beispiele
Beispiel #1 Dynamisches Erzeugen einer Funktion, mit create_function() oder anonymen Funktionen
Eine dynamisch erstellte Funktion kann verwendet werden, um (zum Beispiel) eine Funktion aus Informationen zu erstellen, die zur Laufzeit gesammelt wurden. Zuerst unter Verwendung von create_function():
<?php
$newfunc = create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);');
echo $newfunc(2, M_E) . "\n";
?>
Und nun der gleiche Code unter Verwendung einer anonymen Funktion. Zu beachten ist, dass der Code und die Parameter nicht mehr in Zeichenketten eingebettet sind:
<?php
$newfunc = function($a,$b) { return "ln($a) + ln($b) = " . log($a * $b); };
echo $newfunc(2, M_E) . "\n";
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
ln(2) + ln(2.718281828459) = 1.6931471805599
Beispiel #2 Erstellen einer allgemeinen Verarbeitungsfunktion mit create_function() oder anonymen Funktionen
Eine andere Verwendungsmöglichkeit wäre, eine allgemeine Verarbeitungsfunktion zu erstellen, die eine Reihe von Operationen auf eine Liste von Parametern anwenden kann:
<?php
function process($var1, $var2, $farr)
{
foreach ($farr as $f) {
echo $f($var1, $var2) . "\n";
}
}
// Nun erzeugen wir eine Reihe mathematischer Funktionen
$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', '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 "\nWir benutzen nun das erste Array von dynamischen Funktionen\n";
echo "Parameter: 2.3445, M_PI\n";
process(2.3445, M_PI, $farr);
// Nun erzeugen wir eine Reihe 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 gleich 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 von dynamischen Funktionen\n";
process("Twas brilling and the slithy toves", "Twas the night", $garr);
?>
Hier ist noch einmal derselbe Code unter Verwendung einer anonymen Funktion. Es ist zu beachten, dass die Variablennamen in diesem Code nicht mehr maskiert werden müssen, da sie sich nicht in einer Zeichenkette befinden.
<?php
function process($var1, $var2, $farr)
{
foreach ($farr as $f) {
echo $f($var1, $var2) . "\n";
}
}
// Nun erzeugen wir eine Reihe mathematischer Funktionen
$farr = array(
function($x,$y) { return "etwas Trigonometrie: ".(sin($x) + $x*cos($y)); },
function($x,$y) { return "eine Hypotenuse: ".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 "\nWir benutzen nun das erste Array von dynamischen Funktionen\n";
echo "Parameter: 2.3445, M_PI\n";
process(2.3445, M_PI, $farr);
// Nun erzeugen wir eine Reihe von Funktionen zur Bearbeitung von Zeichenketten
$garr = array(
function($b,$a) { if (strncmp($a, $b, 3) == 0) return "** \"$a\" " .
"und \"$b\"\n** sehen für mich gleich aus! (unter Betrachtung der ersten 3 Zeichen"; },
function($a,$b) { return "CRCs: " . crc32($a) . ", ".crc32($b); },
function($a,$b) { return "similar(a,b) = " . similar_text($a, $b, $p) . "($p%)"; }
);
echo "\nWir benutzen nun das zweite Array von dynamischen 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 von dynamischen 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 von dynamischen Funktionen ** "Twas the night" und "Twas brilling and the slithy toves" ** sehen für mich gleich aus! (unter Betrachtung der ersten 3 Zeichen) CRCs: 3569586014, 342550513 similar(a,b) = 11(45.833333333333%)
Beispiel #3 Gebrauch der anonymen Funktionen als Callback-Funktion
Wahrscheinlich liegt der häufigste Anwendungsfall für dynamische Funktionen darin, sie als Callbacks zu übergeben, also z. B. beim Gebrauch von array_walk() oder usort().
<?php
$av = array("the ", "a ", "that ", "this ");
array_walk($av, create_function('&$v,$k', '$v = $v . "mango";'));
print_r($av);
?>
Umgewandelt in eine anonyme Funktion:
<?php
$av = array("the ", "a ", "that ", "this ");
array_walk($av, 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 )
Sortieren von Zeichenketten von der längsten zur kürzesten mit create_function():
<?php
$sv = array("small", "a big string", "larger", "it is a string thing");
echo "Original:\n";
print_r($sv);
echo "Sortiert:\n";
usort($sv, create_function('$a,$b','return strlen($b) - strlen($a);'));
print_r($sv);
?>
Umgewandelt in eine anonyme Funktion:
<?php
$sv = array("small", "a big string", "larger", "it is a string thing");
echo "Original:\n";
print_r($sv);
echo "Sortiert:\n";
usort($sv, function($a,$b) { return strlen($b) - strlen($a); });
print_r($sv);
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
Original: Array ( [0] => small [1] => a big string [2] => larger [3] => it is a string thing ) Sortiert: Array ( [0] => it is a string thing [1] => a big string [2] => larger [3] => small )