PHP Handbuch
Zurück |  | Weiter

# create_function

(PHP 4 >= 4.0.1, PHP 5)

create_function -- Erzeugen einer anonymen / temporären (Lambda-Stil) Funktion

## Beschreibung:

string create_function ( string args, string code)

Erzeugt eine anonyme Funktion an Hand der übergebenen Parameter und gibt einen eindeutigen Namen für diese zurück. Normalerweise sind die args als mit "'" begrenzte Strings zu übergeben. Dies gilt auch für code. Dadurch werden die Variablen vor dem Parsen geschützt. Falls sie """ verwenden, müssen sie die Variablen-Namen "escapen", wie z.B. \$avar.

Dieser Befehl kann z.B. verwendet werden, um eine Funktion an Hand von Informationen zu erzeugen, die erst zur Laufzeit vorliegen.

Beispiel 1. Erzeugen einer anonymen / temporären Funktion per create_function():

`$newfunc = create_function('$a,$b','return "ln($a) + ln($b) = ".log($a * $b);'); echo "Neue Temp-Funktion: $newfunc\n"; echo $newfunc(2,M_E)."\n"; // Ausgabe: // Neue Temp-Funktion: lambda_1 // ln(2) + ln(2.718281828459) = 1.6931471805599`

Sie können auch eine allgemeine Handhabungs-Funktion erstellen, die einen mehr oder weniger große Anzahl an Operationen mit einer Liste von Parametern durchführt.

Beispiel 2. Beispiel zum o.a. Verwendungszweck:

`function process($var1, $var2, $farr) {
for ($f=0; $f < count($farr); $f++)
echo $farr[$f]($var1,$var2)."\n";
}
// Erzeugung eines Bündels an 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 "als trig: ".(sin($x) + $x*cos($y));'),
create_function('$x,$y', 'return "als Hypotenuse: ".sqrt($x*$x + $y*$y);'),
create_function('$a,$b', $f1),
create_function('$a,$b', $f2),
create_function('$a,$b', $f3)
);
echo "\nGebrauch des ersten Arrays der anonymen Funktionen\n";
echo "Parameter: 2.3445, M_PI\n";
process(2.3445, M_PI, $farr);
// Erzeugung eines Bündels an String-Behandlungs-Routinen
$garr = array(
create_function('$b, $a','if (strncmp ($a, $b, 3) == 0) return "** \"$a\" '.
'und \"$b\"\n** Sieht für mich gleich aus! (ansehen der ersten 3 Zeichen)";'),
create_function('$a, $b','; return "CRCs: ".crc32($a)." , ".crc32(b);'),
create_function('$a, $b','; return "ähnlich(a, b) = ".similar_text($a, $b, &$p)."($p%)";')
);
echo "\nGebrauch des zweiten Arrays der anonymen Funktionen\n";
process("Twas brilling and the slithy toves", "Twas the night", $garr);`

wenn sie nun den o.a Code ausführen lassen, wird folgendes ausgegeben :

    Gebrauch des ersten Arrays der anonymen Funktionen
    Parameter: 2.3445, M_PI
    als trig: -1.6291725057799
    als Hypotenuse: 3.9199852871011
    b*a^2 = 4.8103313314525
    min(b^2+a, a^2,b) = 8.6382729035898
    ln(a/b) = 0.27122299212594

    Gebrauch des zweiten Arrays der anonymen Funktionen
    ** "Twas the night" und "Twas brilling and the slithy toves"
    ** Sieht für mich gleich aus! (ansehen der ersten 3 Zeichen)
    CRCs: -725381282 , 1908338681
    ähnlich(a,b) = 11(45.833333333333%)

Möglicherweise 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:

`$av = array("der ","ein ","dieser ","jener ");
array_walk($av, create_function('&$v,$k','$v = $v."Zug";'));
print_r($av); // mit PHP3 benutzen sie bitte var_dump()
// Ausgaben:
// Array
// (
// [0] => der Zug
// [1] => ein Zug
// [2] => dieser Zug
// [3] => jener Zug
// )
// Ein Array aus Strings nach Länge geordnet
$sv = array("kurz","länger","noch länger","dieser ist am längsten");
print_r($sv);
// Ausgaben:
// Array
// (
// [0] => kurz
// [1] => länger
// [2] => noch länger
// [3] => dieser ist am längsten
// )
// Sortierung von lang nach kurz
usort($sv, create_function('$a,$b','return strlen($b) - strlen($a);'));
print_r($sv);
// Ausgabe:
// Array
// (
// [0] => dieser ist am längsten
// [1] => noch länger
// [2] => länger
// [3] => kurz
// )`

Zurück | Zum Anfang | Weiter
call_user_func | Nach oben | func_get_arg