Benutzer-Werkzeuge

Webseiten-Werkzeuge


php:anonymefunktionundclosure

PHP

Anonyme Funktion und Closure

Anonyme Funktion

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!

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 '<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">

Array Beispiele

php/anonymefunktionundclosure.txt · Zuletzt geändert: 2013/05/01 15:17 von raiser