2012-08-12 126 views
3

簡單的問題,但艱難的答案?我在類方法中有以下匿名函數:在匿名函數中調用匿名函數(初始)

$unnest_array = function($nested, $key) { 
    $unnested = array(); 

    foreach ($nested as $value) { 
     $unnested[] = (object) $value[$key]; 
    } 

    return $unnested; 
}; 

在同一個類方法中,我有這個數組,我保存了匿名函數。即我使用內聯create_function()創建了一個新的匿名函數,我想要使用已定義的匿名函數$unnest_array()。可能嗎?

$this->_funcs = array(
    'directors' => array(
     'func' => create_function('$directors', 'return $unnest_array($directors, "director");'), 
     'args' => array('directors') 
    ) 
); 

此刻我得到「Undefined variable:unnest_array」。幫幫我?

+1

您可能想將其稱爲「關閉」並刪除所有內容。 – 2012-08-12 19:04:18

+0

[php.net](http://php.net/manual/en/functions.anonymous.php)將其稱爲匿名函數以及閉包。爲什麼要刪除一切 – Viktor 2012-08-12 22:04:15

+0

加1即使只是爲了開始部分:D – Bakaburg 2012-09-05 00:32:31

回答

2

爲什麼您首先使用create_function?完全替代create_function的閉包,在5.3之後的所有版本的PHP中都基本廢棄了。看起來你試圖partially apply$unnest_array固定第二個參數爲"director"

除非我誤解了你,你應該能夠通過使用關閉/匿名函數(未經測試),以達到相同的結果:

$this->_funcs = array(
    'directors' => array(
     'func' => function($directors) use ($unnest_array) 
      { 
       return $unnest_array($directors, "director"); 
      }, 
     'args' => array('directors') 
    ) 
); 

use ($unnest_array)條款是需要訪問父局部變量關閉的範圍。

+2

小修正:'使用($ unnest_array)'而不是'使用$ unnest_array'。 – hakre 2012-08-12 19:07:53

+0

@hakra:謝謝,我的壞。自從我使用PHP以來已經有一段時間了! – 2012-08-12 19:10:47

+0

你完美的讀完了我,謝謝!我沒有意識到'使用'關鍵字。 – Viktor 2012-08-12 21:49:22