从PHP中的匿名函数访问父函数作用域


Accessing parent function scope from anonymous function in PHP

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

我尝试了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;
}

那么,有人知道如何优雅地解决这个问题吗?

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

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