2015-09-07 40 views
0

我在这两个WordPress的功能:PHP匿名函数:未定义的变量

$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

+4

后'函数(POST_ID $)'你需要添加'使用(wpb_set_post_views)'。该变量超出了范围。 – Andrew

+0

@Andrew你的意思是'use($ wpb_set_post_views)'? – marcelo2605

+0

是的,我的坏,忘了'$'。 – Andrew

回答

3

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

您的匿名函数应该是如下

function() use ($variableNeeded) { } 

然后,您将有机会获得该变量。

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

function() use (&$variableNeeded) { } 
+0

真的没有必要通过引用传递它。 – Andrew

+1

在这个例子中,可能不是,但是如果你需要将值更改反映在闭包之外,则需要通过引用传递。调用闭包与调用任何其他函数相同,因此您将传递值。 – Zarathuztra

1

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

所以,你的代码将

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

+0

Global在这里真的没有答案。 – Andrew

+0

全球是如此2008年,不要使用 – Zarathuztra