从PHP中的匿名函数访问父函数范围

时间:2014-04-28 20:10:25

标签: php wordpress

我为wordpress创建了这个 awesome 插件,可以使用类似乳胶的标签轻松添加对博客帖子的引用。它工作得很好,但有一个讨厌的细节:我正在使用全局变量,因为我需要更改匿名函数中的变量,我无法更改传递的参数(它是一个回调函数)。

我尝试了use语法并且它可以正常工作,但变量将复制到匿名函数中。

以下是代码,缩写为快速概述我想要做的事情:

// Global variables, ugh...
// I don't want to declare $reflist here!
$reflist = array();

// Implementation of reference parsing.
function parse_references( $str ) {

    // Clear array
    $reflist = array();

    // I want to declare $reflist here!

    // Replace all tags
    $newstr = preg_replace_callback( "/{.*}/", 
        function ( $matches ) {

            // Find out the tag number to substitute
            $tag_number = 5;

            // Add to $reflist array
            global $reflist;
            // I don't want to have to use a global here!
            $reflist[] = $tag_number;

            return "[$tag_number]";   


    }, $str );

    return $newstr;
}

所以有人知道如何优雅地解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

使用use构造通过引用传递变量。这样,修改匿名函数中的$reflist会产生外部效应,这意味着原始变量的值会发生变化。

$newstr = preg_replace_callback("/{.*}/", function($matches) use (&$reflist) {
    $tag_number = 5;                            // important  ----^     
    $reflist[] = $tag_number;
    return "[$tag_number]";
}, $a);