php匿名函式和閉包

2021-09-07 10:19:31 字數 1191 閱讀 8072

在談閉包之前,先說一下匿名函式,匿名函式實際上相當於把函式當做變數,不需要專門去定義乙個函式。

在匿名函式出現之前,如果想把函式當做變數傳遞,得用字串的形式,如下:

$anonymous = function ();

function normal()

function testanonymous($func)

testanonymous($anonymous);

testanonymous('normal');

ps:另外php還提供了乙個在執行時動態建立函式的方法,create_function

$newfunc = create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);');

echo "new anonymous function: $newfunc\n";

echo $newfunc(2, m_e) . "\n";

// outputs

// new anonymous function: lambda_1

// ln(2) + ln(2.718281828459) = 1.6931471805599

奇特的是這個create_function生成的函式居然是lambda_1型別,而不是closure。

然而匿名函式中不能使用外部變數,為了解決這個問題,出現了閉包。

閉包可以捕獲外部環境中的變數,由於在php中是早繫結,在閉包定義時,傳入閉包的值就確定了。

如果外部變數發生了改變,那麼閉包中的變數是不會變的,而且我們在閉包中也不能修改外部值。

解決辦法是使用引用傳值,在捕獲的變數前新增&。

function test();

$closure2 = function () use (&$v);

$v = "world";

echo "closure1:".$closure1();

echo "\n";

echo "closure2:".$closure2();

}test();

另外如果在類中使用閉包,如過php版本低於5.3,是不能使用$this的。

閉包會編譯成opcode並快取起來,而create_function是在執行時動態建立,效率要比閉包低,建議使用閉包。

匿名函式和閉包

匿名函式 匿名函式和普通函式 function box alert box 閉包概念 閉包是指有權訪問另乙個函式作用域中的變數的函式,建立閉包的常見的方式,就是在乙個函式內部建立另乙個函式,通過另乙個函式訪問這個函式的區域性變數。閉包作用 使用閉包有乙個優點,也是其缺點。可以把區域性變數駐留在記憶體...

閉包和匿名函式

匿名函式 沒有函式名稱的函式 這就是匿名函式 function argument1,argument2 閉包 乙個可以使用另外乙個函式作用域中的變數的函式。如下面的 函式b就是閉包,但是這個前提是 當函式a的內部函式b被函式a外的乙個變數引用的時候,就建立了乙個我們通常所謂的 閉包 意思是說b要變成...

閉包和匿名函式

閉包是指在建立時封裝周圍狀態的函式.即便閉包所在的環境不存在了,閉包中封裝的狀態依然存在.匿名函式其實就是沒有名字的函式 從理論上講閉包和匿名函式是不同的概念.但是php將其視作為相同的概念 注意 閉包和匿名函式其實是偽裝成函式的物件.如果審查php閉包或匿名函式,會發現它們是closure類的例項...