php 5.3新增的閉包文法介紹function() use() {}

來源:互聯網
上載者:User

標籤:http   注意   net   調用   方式   java   游離   賦值   count   

原文地址  http://bbs.csdn.net/topics/360002529

<?php/** * author: selfimpr * mail: [email protected] * blog: http://blog.csdn.net/lgg201 * 下面提到的代碼在PHP5.3以上版本運行通過. */ function callback($callback) {    $callback();} //輸出: This is a anonymous function.<br />\n//這裡是直接定義一個匿名函數進行傳遞, 在以往的版本中, 這是停用.//現在, 這種文法非常舒服, 和javascript文法基本一致, 之所以說基本呢, 需要繼續向下看//結論: 一個舒服的文法必然會受歡迎的.callback(function() {    print "This is a anonymous function.<br />\n";}); //輸出: This is a closure use string value, msg is: Hello, everyone.<br />\n//這裡首先定義了一個閉包, 這次戶口本上有名字了...//use, 一個新鮮的傢伙...//眾所周知, 閉包: 內建函式使用了外部函數中定義的變數.//在PHP新開放的閉包文法中, 我們就是用use來使用閉包外部定義的變數的.//這裡我們使用了外部變數$msg, 定義完之後, 又對其值進行了改變, 閉包被執行後輸出的是原始值//結論: 以傳值方式傳遞的基礎型別參數, 閉包use的值在閉包建立是就確定了.$msg = "Hello, everyone";$callback = function () use ($msg) {    print "This is a closure use string value, msg is: $msg. <br />\n";};$msg = "Hello, everybody";callback($callback); //輸出: This is a closure use string value lazy bind, msg is: Hello, everybody.<br />\n//換一種引用方式, 我們使用引用的方式來use//可以發現這次輸出是閉包定義後的值...//這個其實不難理解, 我們以引用方式use, 那閉包use的是$msg這個變數的地址//當後面對$msg這個地址上的值進行了改變之後, 閉包內再輸出這個地址的值時, 自然改變了.$msg = "Hello, everyone";$callback = function () use (&$msg) {    print "This is a closure use string value lazy bind, msg is: $msg. <br />\n";};$msg = "Hello, everybody";callback($callback); //輸出: This is a closure use object, msg is: Hello, everyone.<br />\n//閉包中輸出的是之前被拷貝的值為Hello, everyone的對象, 後面是對$obj這個名字的一個重新賦值.//可以這樣考慮//1. obj是對象Hello, everyone的名字//2. 對象Hello, everyone被閉包use, 閉包產生了一個對Hello, everyone對象的引用//3. obj被修改為Hello, everybody這個對象的名字//4. 注意, 是名字obj代表的實體變了, 而不是Hello, everyone對象, 那自然閉包的輸出還是前面的Hello, everyone$obj = (object) "Hello, everyone";$callback = function () use ($obj) {    print "This is a closure use object, msg is: {$obj->scalar}. <br />\n";};$obj = (object) "Hello, everybody";callback($callback); //輸出: This is a closure use object, msg is: Hello, everybody.<br />\n//還是按照上面的步驟, 按部就班的來吧://1. obj名字指向Hello, everyone對象//2. 閉包產生一個引用指向Hello, everyone對象//3. 修改obj名字指向的對象(即Hello, everyone對象)的scalar值//4. 執行閉包, 輸出的自然是Hello, everybody, 因為其實只有一個真正的對象$obj = (object) "Hello, everyone";$callback = function () use ($obj) {    print "This is a closure use object, msg is: {$obj->scalar}. <br />\n";};$obj->scalar = "Hello, everybody";callback($callback); //輸出: This is a closure use object lazy bind, msg is: Hello, everybody.<br />\n//閉包引用的是什麼呢? &$obj, 閉包產生的引用指向$obj這個名字所指向的地址.//因此, 無論obj怎麼變化, 都是逃不脫的....//所以, 輸出的就是改變後的值$obj = (object) "Hello, everyone";$callback = function () use (&$obj) {    print "This is a closure use object lazy bind, msg is: {$obj->scalar}. <br />\n";};$obj = (object) "Hello, everybody";callback($callback); /** * 一個利用閉包的計數器產生器 * 這裡其實借鑒的是python中介紹閉包時的例子... * 我們可以這樣考慮: *         1. counter函數每次調用, 建立一個局部變數$counter, 初始化為1. *         2. 然後建立一個閉包, 閉包產生了對局部變數$counter的引用. *         3. 函數counter返回建立的閉包, 並銷毀局部變數, 但此時有閉包對$counter的引用,  *             它並不會被回收, 因此, 我們可以這樣理解, 被函數counter返回的閉包, 攜帶了一個游離態的 *             變數. *         4. 由於每次調用counter都會建立獨立的$counter和閉包, 因此返回的閉包相互之間是獨立的. *         5. 執行被返回的閉包, 對其攜帶的游離態變數自增並返回, 得到的就是一個計數器. * 結論: 此函數可以用來產生相互獨立的計數器. */function counter() {    $counter = 1;    return function() use(&$counter) {return $counter ++;};}$counter1 = counter();$counter2 = counter();echo "counter1: " . $counter1() . "<br />\n";echo "counter1: " . $counter1() . "<br />\n";echo "counter1: " . $counter1() . "<br />\n";echo "counter1: " . $counter1() . "<br />\n";echo "counter2: " . $counter2() . "<br />\n";echo "counter2: " . $counter2() . "<br />\n";echo "counter2: " . $counter2() . "<br />\n";echo "counter2: " . $counter2() . "<br />\n";?>

 

php 5.3新增的閉包文法介紹function() use() {}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.