====== PHP ====== [[00start|Zurück zur Übersicht]] ===== Anonyme Funktion und Closure ===== ==== Anonyme Funktion ==== Anonyme Funktionen werden über eine Referenz angesprochen. Bis PHP 5.3 muss man anonyme Funktion über **[[http://php.net/create_function|create_function]]** erstellen. Ab PHP 4.0.1 $myfunc = create_function( '$param1', 'echo $param1;' ); $myfunc( "Hallo Welt!" ); //Ausgabe: Hallo Welt! Ab PHP 5.3 $myfunc = function( $param1 ){ echo $param1; }; $myfunc( "Hallo Welt!" ); //Ausgabe: Hallo Welt! ==== Closure ==== Eine Closure ist eine anonyme Funktion, die sich ihren Erstellungskontext merkt. Ab PHP 4.0.1 function Add( $param_to_add ){ return create_function( '$param1', 'return '. $param_to_add .' + $param1;' ); } $myfunc_add4 = Add( 4 ); $myfunc_add3 = Add( 3 ); echo $myfunc_add4( 6 ); //Ausgabe: 10 echo $myfunc_add3( 6 ); //Ausgabe: 9 Ab PHP 5.3 $add = function($param_to_add) { return function ($param1) use ($param_to_add) { return $param1 + $param_to_add; }; }; $myfunc_add4 = $add( 4 ); $myfunc_add3 = $add( 3 ); echo $myfunc_add4( 6 ); // Ausgabe: 10 echo $myfunc_add3( 6 ); // Ausgabe: 9 ==== Anwendungsbeispiel ==== === Farbiger Zeilenwechsel === Leider unterstützt PHP bis Version 5.3 keine Referenz von Variablen bei der Lambda-Funktion (Closure).\\ Deshalb wird die **GLOBALE Variable (cycleItems )** benötigt, über die dann iteriert wird.\\ Der Variablenname wird bei der Erstellung der anonymen Funktion mit übergeben. //cycle: mit parameter des variablennamen function cycle( $cycleVarName ){ //closure: globale variable wird in der funktion erstellt return create_function( '', ' //zugriff auf globale varibale global $'.$cycleVarName.'; //aktuelle element holen $elm = each( $'.$cycleVarName.' ); //wenn aktuelles element null ist, dann liste auf anfang setzen if( $elm === FALSE ){ //auf anfang reset( $'.$cycleVarName.' ); //aktuelles element holen $elm = each( $'.$cycleVarName.' ); } //wert liefern return $elm["value"] ; '); } $cycleItems = array( "zeile_1", "zeile_2", "zeile_3" ); $class_fuer_farbwechsel = cycle( "cycleItems" ); //html echo '
'; // Ausgabe:
echo '
'; // Ausgabe:
echo '
'; // Ausgabe:
echo '
'; // Ausgabe:
echo '
'; // Ausgabe:
echo '
'; // Ausgabe:
Ab PHP 5.3 wird das Ganze einfacher. //cycle: parameter werden als argumentarray in der funktion gelesen function cycle() { $items = func_get_args(); //closure: argumentarray wird als referenz uebergeben return function() use (&$items) { //aktuelles element holen $elm = each($items); //wenn aktuelles element null ist, dann liste auf anfang setzen if ($elm === FALSE) { //auf anfang reset($items); //aktuelles element holen $elm = each($items); } //wert liefern return $elm['value']; }; } $class_fuer_farbwechsel = cycle( "zeile_1", "zeile_2", "zeile_3" ); //html echo '
'; // Ausgabe:
echo '
'; // Ausgabe:
echo '
'; // Ausgabe:
echo '
'; // Ausgabe:
echo '
'; // Ausgabe:
echo '
'; // Ausgabe:
=== Array Beispiele === [[http://stackoverflow.com/questions/2412299/how-do-you-use-anonymous-functions-in-php#2412360|Callback für Array-Funktionen]] \\ [[http://stackoverflow.com/questions/2412299/how-do-you-use-anonymous-functions-in-php#2412659|Buchstaben in einem Array zählen]]