2014-04-28 179 views
0

我做了這個真棒 wordpress的插件可以輕鬆地添加對使用乳膠狀標籤的博客文章的引用。它工作得很好,但有一個令人討厭的細節:我使用全局變量,因爲我需要在匿名函數中更改一個變量,但我無法更改傳遞的參數(它是一個回調函數)。在PHP中使用匿名函數訪問父函數範圍

我試過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; 
} 

因此,沒有人知道如何優雅地解決這個問題?

+0

'$ a'變量未定義。這可能是一個錯誤。 –

+0

不,它應該把{sometag}變成[5] :) –

+0

'$ str'參數的用法是什麼? –

回答

2

將參數與use構造一起傳遞給變量。這樣,在匿名函數內修改$reflist的值有外部影響,這意味着原始變量的值發生了變化。

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

哇,這絕對完美!謝謝! –