php 代码修改后 重新实例化_从匿名函数到PHP设计模式之容器模式
點擊藍(lán)字關(guān)注我們!每天獲取最新的編程小知識!
源 /?php中文網(wǎng)? ????源 /?www.php.cn
從匿名函數(shù)(閉包特性)到 PHP 設(shè)計模式之容器模式
(查看原文請點擊本文末尾左下角:
匿名函數(shù)(閉包函數(shù))
匿名函數(shù),也叫閉包函數(shù),它允許臨時創(chuàng)建一個沒有指定名稱的函數(shù),常用作回調(diào)函數(shù)參數(shù)的值,也可以作為變量的值來使用。具體的使用見以下示例代碼:
/*?示例一:聲明一個簡單匿名函數(shù),并賦值給一個變量,通過變量名調(diào)用這個匿名函數(shù)?*/
$anonFunc = function($param){???
????echo $param;
};
$anonFunc('這里是一個匿名函數(shù)'); // 通過變量名調(diào)用匿名函數(shù),和普通函數(shù)沒什么區(qū)別
/*?示例二:通過在函數(shù)內(nèi)部使用匿名函數(shù)動態(tài)創(chuàng)建函數(shù)?*/
function operate($operator){
????if($operator == '+'){
????????return function($a, $b){
????????????return $a + $b;
????????}
????}
????if($operator == '-'){
????????return function($a, $b){
????????????return $a - $b;
????????}
????}
}
$add = operate('+');
echo $add(4, 3);??? // 7
$sub = operate('-');
echo $sub(4, 3);??? // 1
/*?示例三:匿名函數(shù)作為回調(diào)函數(shù)參數(shù)傳入?*/
function callback($callback){
????$callback();
}
function callback(){
????// 閉包測試函數(shù)
????echo '這里是閉包測試函數(shù)體';
}
以上代碼中的三個示例中,匿名函數(shù)都沒有進(jìn)行傳參,我們知道在?JavaScript? 中匿名函數(shù)用得很頻繁,而且父函數(shù)中的參數(shù)變量在子函數(shù)中可以直接使用,但是?PHP?語言不允許這樣做,需要用到?use?($var)? 關(guān)鍵字(注意代碼中的使用方式)實現(xiàn)同樣的目的。
針對上面代碼中的示例三做如下修改:
/*?示例三修改:匿名函數(shù)作為參數(shù)傳入,并且攜帶參數(shù)?*/
function callback($callback) use ($content){
????$callback($content);
}
$content = '這里是閉包函數(shù)的輸出內(nèi)容';
function callback($content){
????// 閉包函數(shù)
????echo $content;
}
以上代碼中的示例二,也可以通過?use?關(guān)鍵字實現(xiàn)匿名函數(shù)對父函數(shù)外層變量的引用。這些示例代碼中匿名函數(shù)和閉包特性的運(yùn)用,只是為了理解概念,并沒有多大的實戰(zhàn)意義,閉包的用途有很多,常見的是用在?PHP?框架中容器模式的依賴注入(DI)中。
PHP 面向?qū)ο笾萜髂J?/strong>
顧名思義,容器就是用來存放東西的,其實就是聲明一個類,專門用來存取對象實例,既然如此,那么容器里至少要有兩個核心方法,以實現(xiàn)綁定依賴到容器和從容器獲取依賴。
容器可以說是一個依賴管理工具,有時候也叫做服務(wù)容器。
/* 聲明一個簡單的容器類 */
class Container{
????private $_diList = array();??? // 用于存放依賴
????/* 核心方法之一,用于綁定服務(wù)
????* @param string $className 類名稱
????* @param mixed $concrete 依賴在容器中的存儲方式,可以是類名字符串,數(shù)組,一個實例化對象,或者是一個匿名函數(shù)
????*/
????puclic function set($className, $concrete){
????????????$this->_diList[$className] = $concrete;??
????}
????/*
????* 核心方法之二,用于獲取服務(wù)對象
????* @param string $className 將要獲取的依賴的名稱
????* @return object 返回一個依賴的實例化對象
????*/
????public function get($className){
????????if(isset($this->_diList[$className])){
????????????return $this->diList[$className];
????????}???
????????return null;
????}
}
以上代碼就是一個簡單的容器模式,其中的?set?方法用于注冊依賴,get?方法用于獲取依賴。容器存儲依賴的方式有很多,以下示例代碼以匿名函數(shù)的方式作為說明。
/* 數(shù)據(jù)庫連接類 */
class Connection{
????public function __construct($dbParams){
????????// connect the database...???
????}
????public someDbTask(){
????????// code...
????}
}
/* 會話控制類 */
class Session{
????public function openSession(){
????????session_start();
????}
????// code...
}
$container->set('session', function(){
????return new Session();
});
$container = new Container();
// 使用容器注冊數(shù)據(jù)庫連接服務(wù)
$container->set('db', function(){
????return new Connetion(array(?
????????"host" => "localhost",?
????????"username" => "root",?
????????"password" => "root",?
????????"dbname" => "dbname"?
????));
});
// 使用容器注冊會話控制服務(wù)
$container->set('session', function(){
????return new Session();
});
// 獲取之前注冊到容器中的服務(wù),并進(jìn)行業(yè)務(wù)的處理
$container->get('db')->someDbTask();
$container->get('session')->openSession();
以上代碼是對容器的使用方法,其中注冊了?db?和?session?兩個服務(wù),這里使用匿名函數(shù)作為依賴的存儲方式,在調(diào)用? $container->set()?方法進(jìn)行注冊服務(wù)時實際上并沒有進(jìn)行實例化,而是在調(diào)用?$container->get()? 方法獲取依賴的時候才執(zhí)行匿名函數(shù),并將實例化對象返回,這樣實現(xiàn)了按需實例化,不用則不實例化,提高了程序的運(yùn)行效率。
-END-
聲明:本文選自「?php中文網(wǎng)?」,搜索「?phpcnnew?」即可關(guān)注!
▼
總結(jié)
以上是生活随笔為你收集整理的php 代码修改后 重新实例化_从匿名函数到PHP设计模式之容器模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 没有shell63号单元_苏教版15年级
- 下一篇: 联想g510升级方案_联想集团副总裁阿木