【问题标题】:PHP Anonymous functions: undefined variablePHP匿名函数:未定义的变量
【发布时间】:2015-12-03 03:57:23
【问题描述】:

我有这两个 WordPress 功能:

$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);
});

但页面最后一行返回Notice: Undefined variable: wpb_set_post_views

【问题讨论】:

  • function ($post_id) 之后需要添加use (wpb_set_post_views)。变量超出范围。
  • @Andrew 你是说use ($wpb_set_post_views) 吗?
  • 是的,我的错,忘了$
  • 那么你真的需要这个匿名函数吗?
  • 您找到问题的答案了吗?

标签: php wordpress php-5.3


【解决方案1】:

使用 global 关键字访问函数中的外部变量。

所以你的代码将是

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);
});

或者

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);
    });

请参考http://php.net/manual/en/language.variables.scope.php

【讨论】:

  • 全球在这里真的没有答案。
  • Global is so 2008,不要用
【解决方案2】:

在 PHP 中处理闭包时,您需要确保将任何超出范围的变量放入闭包范围。这与 JavaScript 不同,在 JavaScript 中,闭包可以访问 PHP 范围内声明的变量。

你的匿名函数应该如下

function() use ($variableNeeded) { }

然后您将可以访问该变量。

请务必记住,这是按值传递的场景,因此对该变量的任何更改都不会反映在闭包之外,因此您需要通过引用进行更改。

function() use (&$variableNeeded) { }

【讨论】:

  • 确实没必要通过引用传入。
  • 在这个例子中,可能不会,但是如果你需要将值的变化反映到闭包之外,你需要通过引用传递。调用闭包与调用任何其他函数一样,因此您将按值传递。
猜你喜欢
  • 2012-07-10
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-08
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
相关资源
最近更新 更多