phalapi之DI依賴注入和單例實現

來源:互聯網
上載者:User
單利模式和依賴注入,相信很多人都不陌生。本文主要講解了phalapi的DI依賴注入和單例模式,對依賴注入和單例模式有興趣的同學可以看一下。

1. 單例模式

單例模式對於長期進行過物件導向編程的童鞋應該不算陌生,在學習php的童鞋也應該有聽過,這裡簡單的聊一聊單例模式到底是一個怎麼樣東西,解決了什麼問題,並且在PhalApi中是如何?的.

單例單例,所謂單例也就是有且只有一個存在,這就是單例,不難看出他的好處資源利用少因為只有一個,大家都是知道要使用一個類必須要執行個體他也就是new在每次new一個對象的時候都會在記憶體中產生一塊地區來存放這個執行個體,如果在程式一次運行中使用了很多的new執行個體化了同一個對象,那就比較消耗資源了,但是如果是通用一個使用全域變數global程式又會顯得不優雅而且會很亂,在這種情況下單例模式就產生了.


單例模式就是一個兩全其美的一個方法既可以全域通用,二不用擔心佔用過多的資源,三又非常優雅,我們來一起看看在PhalApi中是如何?單例模式的:

//大家看到我們常用的DI方法內部實現的是PhalApi_DI中的靜態方法one方法function DI() {    return PhalApi_DI::one();}

然後我們看向one方法內部


每當我們請求過來的時候先驗證靜態變數instance是不是沒有被初始化,如果是第一次調用他會在內部去執行個體化PhalApi_DI類然後負值給$instance然後返回執行個體好的這個靜態變數,當我們下次在請求過來的時候這個靜態變數已經被執行個體化好了就會直接跳過執行個體的過程直接返回這個對象,也就是我們在PhalApi架構所有的地方使用的DI方法其實都是一個對象,在記憶體中只存在一塊地區,代碼如下:

public static function one(){    if(self::$instance == NULL){        self::$instance = new PhalApi_DI();        self::$instance->onConstruct();    }    return self::$instance;}

其實不難我們只用吧new一個類的操作封裝到我們需要new的類的靜態方法在向上面一樣的去判斷,就可以很簡單的去實現單例模式.


2. 依賴注入

依賴注入又稱之為"控制反轉",如果是熟悉javaweb開發的spring架構應該有比較深的感觸,在這裡也不往深的講,就簡單講解一下PhalApi中DI依賴注入的實現讓大家瞭解這種設計模式如何?以及自此基礎上實現的惰性載入機制.


2.1 DI依賴注入實現

大家在PhalApi中常用的DI()方法,也就是採用我們上面所謂的單例模式不用多說了,也就是我們每次使用DI()其實就是在使用PhalApi_DI類,那麼我們依賴注入的關鍵也就是在PhalApi_DI之中


先來講一下他的一個實現方式在來講具體實現,這裡舉個例子:

//配置DI()->config = new PhalApi_Config_File(API_ROOT . '/Config');

其實在內部有一個數組,它吧config作為了key,吧new PhalApi_Config_File(API_ROOT . '/Config')作為了value然後儲存了起來當我們下一次使用DI->config->get();的時候它就會根據key值config拿出開始new好的類,所以可以說config操作是依賴於DI(),而且在使用DI()->config的時候永遠都是在使用的一個執行個體,也能減少資源的消耗.

有的童鞋就好奇了為什麼DI()->config會存到數組需要的時候會拿出來呢,感興趣的童鞋可以百度一下魔法方法ser和get

/**大家可以看到這是PhalApi_DI中的魔法方法__set * 也就是當使用DI()->config = new PhalApi_Config_File(API_ROOT . '/Config');的時候 * 獲得的name值就是config,獲得的value也就是new PhalApi_Config_File(API_ROOT . '/Config'); */get同理,在內部實現都是調用了內部get和set方法public function __set($name, $value){    $this->set($name, $value);}public function __get($name){    return $this->get($name, NULL);}

看完之後大家是不是覺得很簡單啊,大家以後也可以在自己設計類的時候採用這種靈活的魔法方法實現.


2.2 惰性載入

在PhalApi中的DI()方法也提供惰性載入,惰性載入如字意也就是當類沒有被使用到的時候不會載入,這樣的操作也是為了避免浪費不必要的資源,當我們不是用的時候永遠不會去執行個體化只有當你使用到的時候才會去new這個類然後執行個體化之後使用,我們來看看是如何?的.

//當我們執行以下語句的時候,在依賴注入的時候存的是value值是字串的testDI()->test = 'test';//使用DI()->test->test();的時候會使用到PhalApi中的get方法,在get方法中有一段代碼$this->data[$key] = $this->initService($this->data[$key]);//在initService方法內部驗證了value是字串就執行個體化了再返回if($config instanceOf Closure){    $rs = $config();}elseif(is_string($config) && class_exists($config)){    $rs = new $config();    if(is_callable(array($rs, 'onInitialize'))){        call_user_func(array($rs, 'onInitialize'));    }}else{    $rs = $config;}

相關推薦:

phalapi之如何?資料庫讀寫分離

phalapi-緩衝的使用以及redis拓展

PhalApi(π架構)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.