在看到 Yii 架構的時候,還有 Discuz 的來源程式,喜歡在初始化和 dispatch 之前 new 一個 application 對象,這個對象有什麼用嗎?或者說有什麼好處嗎?
一般不是初始化和配置之後,再路由分發到 Controller/Action 一級開始執行,為什麼在這中間要多一層 application 對象呢?
PHP 執行完生命週期就結束了,不管是 require/include/autoload 到最後其實都相當於一個檔案對嗎?需要的全域參數我可以 define/$_SERVER/$_ENV,需要的全域方法我可以 public static function,那上面說的那個 application 對象究竟有什麼用處呢?
回複內容:
在看到 Yii 架構的時候,還有 Discuz 的來源程式,喜歡在初始化和 dispatch 之前 new 一個 application 對象,這個對象有什麼用嗎?或者說有什麼好處嗎?
一般不是初始化和配置之後,再路由分發到 Controller/Action 一級開始執行,為什麼在這中間要多一層 application 對象呢?
PHP 執行完生命週期就結束了,不管是 require/include/autoload 到最後其實都相當於一個檔案對嗎?需要的全域參數我可以 define/$_SERVER/$_ENV,需要的全域方法我可以 public static function,那上面說的那個 application 對象究竟有什麼用處呢?
這個APP對象用處可大了:
- 測試:一個應用就是一個app對象,所以單元測試的時候只要建立app對象-測試-銷毀app對象這樣就可以很簡單地搞定測試前的setup和測試後teardown;並且可以通過繼承app對象,利用多態來打樁,單元測試輕鬆搞定。
- 避免全域變數:全域變數是邪惡滴~ 消滅全域變數~ 但是有很多配置是全域的怎麼辦?都塞到這個app對象裡吧
- 通過不同類型的app對象,可以輕鬆改變程式對外的介面 -- 拿Yii架構來說,搞個CWebApplication則就是正常的web應用,換個CConsoleApplication就搖身一變——成了一個控制台應用,好神奇地說~
- 還沒想出來...
類似的app對象一般是作為服務容器存在的,例如symfony2和mini型的silex,都是相同的概念,把一些執行個體化的對象啊配置項啊什麼的塞到這個app對象裡,那麼只要你能訪問app對象,就可以拿到這些東西,這種方式我很喜歡。
有個抽象出來的專門作為依賴注入容器的輕便庫叫pimple,有時間你可以瞭解下。