create_function

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

create_functionErzeugen einer anonymen (Lambda-Stil) Funktion

Warnung

Diese Funktion ist seit PHP 7.2.0 als DEPRECATED (veraltet) markiert. Sich auf diese Funktion zu verlassen ist in keiner Weise empfehlenswert.

Beschreibung

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

Erzeugt eine anonyme Funktion anhand der übergebenen Parameter und gibt einen eindeutigen Namen für diese zurück.

Achtung

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.

Parameter-Liste

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.

Rückgabewerte

Gibt einen eindeutigen Funktionsnamen als String oder FALSE im Fehlerfall zurück.

Beispiele

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(2M_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.3445M_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($avcreate_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
($svcreate_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
)

Siehe auch