PHP中的閉包

2022-06-19 18:57:12 字數 1459 閱讀 4964

在php中,由於存在函式內部不能訪問全域性作用的,所以就需要一種可以引入上一級作用域的語法結構,這種就是 閉包。

語法   function () use () {}

例子:

<?php 

$a = 1;

$closure = function () use ($a) ;

$closure();

?>

輸出為:1

這次就實現了閉包的功能了,可以和上級作用域產生了聯絡。

學過js的到這裡一定認為這個$a變數當變化的時候,根據js引用的理論,函式執行的結果也是變化的,但事實究竟是這樣麼?看例子:

<?php 

$a = 1;

$closure = function () use ($a) ;

$closure();

$a=2;

$closure();

?>

大家猜猜結果會是什麼?

1 1
哎??為什麼不是 1 2 呢?

因為對於php來說的閉包當宣告閉包的時候,就已經將值重新開闢了一塊記憶體賦值給了use中的a所以

,不過外

部的'>a所以,不過外部的

a所以,不過外部的a怎麼變,閉包執行的結果是不變的,那麼我們怎麼能讓他變化呢?

先給大家乙個提示,php實現閉包的本質其實是將這個特殊的函式轉換成了乙個類。

說到這裡,大家是不是有一點明白了呢?既然是類,那麼我們可以使用引用來傳遞use當中的值。

讓我們再試一下

<?php 

$a = 1;

$closure = function () use (&$a) ;

$closure();

$a=2;

$closure();

?>

再執行一下看看

1 2
這次結果對了吧。

不僅如此,引用之後,如果在閉包當中修改引入的變數值,原本的變數的值也會修改的,但是不過不加&,那麼在閉包中修改變數的值得時候,即使這次修改有效了,下次重新執行閉包函式後又會回到之前的值,相當於沒有修改。舉個例子:

不加&:

<?php 

$a = 1;

$closure = function () use ($a) ;

$closure();

$closure();

$a=-5;

$closure();

$closure();

?>

輸出為:

2 2 2 2
加了&之後

輸出為

2 3 -4 -3
對應php中的閉包,和js中的閉包還是有本質的區別的,js的閉包是語言原生支援的,所以感覺比較符合人的思考方式,而php得閉包就是將閉包的這種特性抽象成了類的方式,然後以類的形式進行處理,畢竟是抽象出來的,還不是很符合人們的思考方式。

PHP中的閉包

sayhello function name sayhello world 輸出 hello world var dump sayhello instanceof closure 輸出 boolean true name world sayhello function use name 這裡不要忘記...

php的閉包函式bingto php的閉包函式

toc 1 閉包 匿名 函式的意義 閉包 匿名 函式通常作為簡單函式功能的實現。閉包 匿名 函式可以 賦值給變數 或者 作為引數使用 閉包 匿名 函式是 函式程式設計 的基礎 2 閉包 匿名 函式的使用 2 1 匿名函式賦值給變數 greet function name printf hello s...

閉包 Python中的閉包

通俗地講就是別人家有某個東西,你想拿到但是因為許可權不夠 不打死你才怪 但是你可以跟家裡的孩子套近乎,通過他拿到!這個家就是區域性作用域,外部無法訪問內部變數,孩子是從家裡返回物件,對家裡的東西有訪問許可權,借助返回物件間接訪問內部變數!def outer 別人家 x 10 別人家裡的東西 def ...