Anonyme Funktionen werden über eine Referenz angesprochen.
Bis PHP 5.3 muss man anonyme Funktion über 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!
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
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 '<div class="'.$class_fuer_farbwechsel().'">'; // Ausgabe: <div class="zeile_1"> echo '<div class="'.$class_fuer_farbwechsel().'">'; // Ausgabe: <div class="zeile_2"> echo '<div class="'.$class_fuer_farbwechsel().'">'; // Ausgabe: <div class="zeile_3"> echo '<div class="'.$class_fuer_farbwechsel().'">'; // Ausgabe: <div class="zeile_1"> echo '<div class="'.$class_fuer_farbwechsel().'">'; // Ausgabe: <div class="zeile_2"> echo '<div class="'.$class_fuer_farbwechsel().'">'; // Ausgabe: <div class="zeile_3">
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 '<div class="'.$class_fuer_farbwechsel().'">'; // Ausgabe: <div class="zeile_1"> echo '<div class="'.$class_fuer_farbwechsel().'">'; // Ausgabe: <div class="zeile_2"> echo '<div class="'.$class_fuer_farbwechsel().'">'; // Ausgabe: <div class="zeile_3"> echo '<div class="'.$class_fuer_farbwechsel().'">'; // Ausgabe: <div class="zeile_1"> echo '<div class="'.$class_fuer_farbwechsel().'">'; // Ausgabe: <div class="zeile_2"> echo '<div class="'.$class_fuer_farbwechsel().'">'; // Ausgabe: <div class="zeile_3">