站內搜尋

Sunday, August 1, 2021

[PHP] 匿名函式(又稱閉包closure) 引用外部變數時,使用 global 與 use 的差異

以 usort() 來舉例,使用匿名函式的寫法如下... $array = array(200, 300, 100); usort($array, function($a, $b) { return $a > $b; }); print_r($array); //Array ( [0] => 100 [1] => 200 [2] => 300 ) 如果我們想用一個變數($bln)去決定升冪或降冪,寫法可以有以下兩種...
使用 global : $array = array(200, 300, 100); $bln = 1; usort($array, function($a, $b) { global $bln; if ($bln) { return $a < $b; } else { return $a > $b; } }); print_r($array); //Array ( [0] => 300 [1] => 200 [2] => 100 ) 使用 use : $array = array(200, 300, 100); $bln = 1; usort($array, function($a, $b) use($bln) { if ($bln) { return $a < $b; } else { return $a > $b; } }); print_r($array); //Array ( [0] => 300 [1] => 200 [2] => 100 ) 用 global 與 use 結果是相同的,但如果我們多包一層function的時候... $array = array(200, 300, 100); $bln = 1; function mysort($array) { $bln = 0; usort($array, function($a, $b) use($bln) { if ($bln) { return $a < $b; } else { return $a > $b; } }); return $array; } $array = mysort($array); print_r($array); //Array ( [0] => 100 [1] => 200 [2] => 300 ) $array = array(200, 300, 100); $bln = 1; function mysort($array) { $bln = 0; usort($array, function($a, $b) { global $bln; if ($bln) { return $a < $b; } else { return $a > $b; } }); return $array; } $array = mysort($array); print_r($array); //Array ( [0] => 300 [1] => 200 [2] => 100 ) 結論:可以看到 use 是使用所在範圍內有效的變數,而 global 則一定是使用全域變數。

No comments:

Post a Comment