我为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);