$sayhello = function($name);
$sayhello("world");
輸出 hello world
var_dump($sayhello instanceof closure);
輸出 boolean(true)
$name = 'world';
$sayhello = function() use($name);//這裡不要忘記結束的;號
$sayhello();//必須函式方式呼叫,即用(), 輸出hello world
$name = 'zj';
$sayhello();//輸出 hello world
$name = 'world';
$sayhello = function() use(&$name);//這裡不要忘記結束的;號
$sayhello();//必須函式方式呼叫,即用(), 輸出hello world
$name = 'zj';
$sayhello();//輸出 hello zj
closure::bind — 複製乙個閉包,繫結指定的$this物件和類作用域。
closure::bindto — 複製當前閉包物件,繫結指定的$this物件和類作用域。
通過這兩個方法可以給類擴充套件複雜功能,類似策略模式,將實際操作與類定**耦。比如通過bing為使用者類增加行為:
class user
$sayhello = function()\n");
};$swimming = function() is swimming\n");
};$bindsayhello = closure::bind($sayhello, new user());
$bindswimming = closure::bind($swimming, new user());
$bindsayhello();
$bindswimming();
輸出:
可以把類寫的更優雅點:
class user
public function doaction() }}
$sayhello = function()\n");
};$swimming = function() is swimming\n");
};$bindsayhello = closure::bind($sayhello, new user());
$bindsayhello();
$user = new user();
$user->addaction('sayhello', $sayhello);
$user->addaction('swimming', $swimming);
$user->doaction();
bindto方法與bind類似,只是通過閉包呼叫的,將自身繫結到物件或類上。
bind及bindto方法都有第三個引數,確定繫結的作用域。
發現乙個閉包實現中介軟體的例子,搬來作為補充學習:
--------------------- 以下內容來自『奔跑的碼農』,感謝。
<?php輸出:// 框架核心應用層};
// 前置校驗中介軟體
$auth = function($handler) need a auth middleware\n";
return $handler($name);
};};
// 前置過濾中介軟體
$filter = function($handler) need a filter middleware\n";
return $handler($name);
};};
// 後置日誌中介軟體
$log = function($handler) need a log middleware\n";
return $return;
};};
// 中介軟體棧
$stack = ;
// 打包
function pack_middleware($handler, $stack)
return $handler;}
// 註冊中介軟體
// 這裡用的都是全域性中介軟體,實際應用時還可以為指定路由註冊區域性中介軟體
$stack['log'] = $log;
$stack['filter'] = $filter;
$stack['auth'] = $auth;
打包程式
中介軟體的執行順序是由打包函式(pack_middleware)決定,這裡返回的閉包實際上相當於:
編寫規範
中介軟體要要滿足一定的規範:總是返回乙個閉包,閉包中總是傳入相同的引數(由主要邏輯決定), 閉包總是返回控制代碼(handler)的執行結果;
如果中介軟體的邏輯在返回控制代碼return $handler($name)前完成,就是前置中介軟體,否則為後置中介軟體。
PHP中的閉包
在php中,由於存在函式內部不能訪問全域性作用的,所以就需要一種可以引入上一級作用域的語法結構,這種就是 閉包。語法 function use 例子 a 1 closure function use a closure 輸出為 1 這次就實現了閉包的功能了,可以和上級作用域產生了聯絡。學過js的到這...
php的閉包函式bingto php的閉包函式
toc 1 閉包 匿名 函式的意義 閉包 匿名 函式通常作為簡單函式功能的實現。閉包 匿名 函式可以 賦值給變數 或者 作為引數使用 閉包 匿名 函式是 函式程式設計 的基礎 2 閉包 匿名 函式的使用 2 1 匿名函式賦值給變數 greet function name printf hello s...
閉包 Python中的閉包
通俗地講就是別人家有某個東西,你想拿到但是因為許可權不夠 不打死你才怪 但是你可以跟家裡的孩子套近乎,通過他拿到!這個家就是區域性作用域,外部無法訪問內部變數,孩子是從家裡返回物件,對家裡的東西有訪問許可權,借助返回物件間接訪問內部變數!def outer 別人家 x 10 別人家裡的東西 def ...