Anonyme PHP-Funktionen: undefinierte Variable

Lesezeit: 2 Minuten

Ich habe diese beiden WordPress-Funktionen:

$wpb_set_post_views = function($postID) {
    $count_key = 'wpb_post_views_count';
    $count = get_post_meta($postID, $count_key, true);
    if($count==''){
        $count = 0;
        delete_post_meta($postID, $count_key);
        add_post_meta($postID, $count_key, '0');
    }else{
        $count++;
        update_post_meta($postID, $count_key, $count);
    }
};

add_action( 'wp_head', function ($post_id) {
    if ( !is_single() ) return;
    if ( empty ( $post_id) ) {
        global $post;
        $post_id = $post->ID;
    }
    $wpb_set_post_views($post_id);
});

Aber die Seite zurück Notice: Undefined variable: wpb_set_post_views für die letzte Zeile.

  • Nach function ($post_id) Sie müssen hinzufügen use (wpb_set_post_views). Die Variable ist außerhalb des Gültigkeitsbereichs.

    – Andrej

    7. September 2015 um 14:48 Uhr

  • @Andrew Meinst du use ($wpb_set_post_views) ?

    – Marcelo2605

    7. September 2015 um 14:50 Uhr


  • Ja, mein Böses, das vergessen $.

    – Andrej

    7. September 2015 um 14:54 Uhr

  • Brauchen Sie das wirklich, um eine anonyme Funktion zu haben?

    – war

    7. September 2015 um 14:58 Uhr

  • Hast du die Antwort auf deine Frage schon gefunden?

    – Zarathustra

    27. Oktober 2015 um 13:48 Uhr

Beim Umgang mit Closures in PHP müssen Sie sicherstellen, dass alle Variablen außerhalb des Bereichs in den Closure-Bereich gestellt werden. Dies ist anders als bei JavaScript, wo Closures Zugriff auf Variablen haben, die in einem PHP-Bereich deklariert sind.

Ihre anonyme Funktion sollte wie folgt aussehen

function() use ($variableNeeded) { }

Sie haben dann Zugriff auf diese Variable.

Es ist wichtig zu bedenken, dass dies ein Pass-by-Value-Szenario ist, sodass Änderungen an dieser Variablen nicht außerhalb des Abschlusses widergespiegelt werden, sodass Sie eine Referenz übergeben müssen, um Änderungen vorzunehmen.

function() use (&$variableNeeded) { }

  • Es ist wirklich nicht nötig, es als Referenz zu übergeben.

    – Andrej

    7. September 2015 um 14:57 Uhr

  • In diesem Beispiel vielleicht nicht, aber wenn die Wertänderung außerhalb des Abschlusses widergespiegelt werden soll, müssen Sie als Referenz übergeben. Das Aufrufen von Closures ist dasselbe wie das Aufrufen jeder anderen Funktion, sodass Sie als Wert übergeben werden.

    – Zarathustra

    7. September 2015 um 14:58 Uhr

Verwenden Sie das Schlüsselwort global, um auf die externen Variablen in einer Funktion zuzugreifen.

Ihr Code wird also sein

add_action( 'wp_head', function ($post_id) {
    if ( !is_single() ) return;
    if ( empty ( $post_id) ) {
        global $post;
        $post_id = $post->ID;
    }
    global $wpb_set_post_views;
    $wpb_set_post_views($post_id);
});

Oder

add_action( 'wp_head', function ($post_id) {
        if ( !is_single() ) return;
        if ( empty ( $post_id) ) {
            global $post;
            $post_id = $post->ID;
        }
        $wpb_set_post_views = $GLOBALS['wpb_set_post_views'];
        $wpb_set_post_views($post_id);
    });

Siehe http://php.net/manual/en/language.variables.scope.php

  • Global ist hier wirklich keine Antwort.

    – Andrej

    7. September 2015 um 14:57 Uhr

  • Global ist so 2008, nicht verwenden

    – Zarathustra

    27. Oktober 2015 um 13:49 Uhr

1130940cookie-checkAnonyme PHP-Funktionen: undefinierte Variable

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy