首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 匿名函數與 use 子句深度解析:閉包變數捕獲機制

     編輯:PHP 綜合知識

基本語法

$closure = function ($param1) use ($param2) {
    // 匿名函數本體
};

use 子句讓匿名函數能存取定義時作用域的變數(閉包特性)。

變數捕獲時機:定義時 vs 呼叫時

範例 1:預設值捕獲(定義時的值)

function test() {
    $param2 = 'every';
    return function ($param1) use ($param2) {
        $param2 .= 'one';
        print $param1 . ' ' . $param2;
    };
}
$func = test();
$func('hello');  // 輸出:hello everyone

範例 2:定義後修改不影響閉包

function test() {
    $param2 = 'everyone';
    $func = function ($param1) use ($param2) {
        print $param1 . ' ' . $param2;
    };
    $param2 = 'everybody';  // 修改發生在閉包定義之後
    return $func;
}
$func = test();
$func('hello');  // 輸出:hello everyone(捕獲定義時的 'everyone')

範例 3:引用捕獲(& 符號)

function test() {
    $param2 = 'everyone';
    $func = function ($param1) use (&$param2) {  // 注意 & 符號
        print $param1 . ' ' . $param2;
    };
    $param2 = 'everybody';
    return $func;
}
$func = test();
$func('hello');  // 輸出:hello everybody(引用捕獲,取呼叫時的值)

核心差異總結

捕獲方式語法捕獲時機後續修改影響
值捕獲use ($var)閉包定義時不影響
引用捕獲use (&$var)閉包呼叫時影響結果

實務應用場景

  • 回呼函數需要外部狀態
  • 陣列處理函數(array_map、array_filter 等)搭配外部參數
  • 延遲執行邏輯封裝
  • 策略模式的輕量實作

注意事項

  • use 只能捕獲父作用域變數,不可捕獲全域變數(需 global 或 $GLOBALS)
  • PHP 7.1+ 支援 use ($var1, $var2) 多變數捕獲
  • 引用捕獲需謹慎使用,避免非預期的副作用
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved