Laravel 框架關鍵技術解析·讀書筆記(一)
第一章
請求訪問的入口文件,主要完成幾部分工做,分別是:php
- 自動加載函數的添加
- 服務器實例化與服務註冊
- 路由加載
- 請求實例化與路由分發
- 相應生成與發送
其中,自動加載函數用於包含引用文件,改文件是composer工具自動生成的,直接require關鍵字添加便可。laravel
在Laravel框架中一些功能的生成都須要服務容器實現,即IlluminateContainerContainer類的實例,服務容器用於服務註冊和解析,也就是說向服務容器註冊可以實現某些功能的實例或者回調函數,當須要使用該功能時從服務容器中獲取相應的實例來完成。數據庫
訪問網站的根目錄,服務器會調用入口文件進行處理,入口文件會經過IlluminateHttpRequest類的靜態方法createFormGlobals()實現請求的實例化,而後經過路由進行分發處理,路由會根據請求的地址查找路由表,查找到將經過路由表中對應的相應處理方式進行處理並返回響應。服務器
Illuminatedatabase 組件主要用於操做數據庫,他提供了兩種數據庫的方式,一種是查詢構造器方式,一種是Eloqument ORM 方式composer
經過Eloquent ORM 方式操做數據庫須要如下工做框架
- 建立數據庫
- 添加數據庫配置信息
- 啓動Eloquent ORM模塊
- 建立model類
- 經過model類操做數據庫
啓動Eloquent ORM 模塊階段須要用到數據庫的管理類,即IlluminateDatabaseCapsuleManager 類,須要相應初始化,以及數據庫相關配置,以完成數據庫Eloquent ORM 模塊的啓動。函數
第二章(環境搭建)
第三章(框架經常使用的PHP語法)
-
組件開發語法條件工具
- 命名空間
- 文件包含
- 經過composer工具建立依賴管理時,會在vendor目錄下建立一個autoload.php文件和一個composer文件夾,其中composer文件夾中包含了類自動加載函數註冊的相關實現,而autoload.php文件是對外的接口,經過包含該文件就能夠完成類自動加載函數的註冊。
- 【相應問題看源碼,沒可以有很理解,停留層次較淺】
- 匿名函數
-
特殊語法網站
- 魔術方法
- 魔術常量
-
反射ui
- 主要用來動態的獲取系統中的類、實例對象、方法等語言結構的信息,經過反射API函數能夠實現對這些語言構件信息的動態獲取和動態操做等(PHP5具備完整的反射API,添加了對類、接口、函數、方法和擴展進行反向工做的能力)
- 在laravel框架中,服務容器解析服務的過程當中就用到了反射機制
##文件 : Illuminate\Container\Container.php
在Laravel框架中,解析服務是經過build()函數實現,通常分爲兩種狀況:一種是查找對應的服務是否被服務提供者註冊爲實例或者提供服務的匿名函數,若是是,則直接進行服務解析;第二種是服務名稱沒有響應的服務綁定,經過反射機制來動態建立服務。經過反射機制動態建立服務的過程能夠分爲兩個步驟:第一步是經過放射機制獲取服務類構造函數的信息,第二步是解決服務類構造函數的依賴問題。【判斷是否存在構造函數,不存在直接實例化,存在則經過getParameters()來獲取輸入函數,並有相應的方法解決依賴參數問題,實現依賴注入。】
-
後期靜態綁定
- 一樣的相關介紹,在《深刻PHP:面向對象、模式與實踐》中也有相關介紹,增長了一個後期延遲靜態綁定的功能,用於繼承範圍引用靜態調用的類
- 在類的繼承過程當中,使用的類再也不是當前類,而是調用的類,後期靜態延遲綁定使用關鍵字static來實現,經過這種機制,「static::」再也不解析未定義當前方法所在的類,而是在實際運行時計算獲得的。即爲運行時最初調用的類。
- 後期延遲綁定還能夠用於對象實例中。在對象實例化中static會根據運行時調用的類來決定實例化對象,而self是根據所在位置的類來決定實例化對象【更多實例,參見IlluminateEloquentModel類的代碼,該類中使用了大量的後期靜態綁定】
- 新特性
-
trait
- 單繼承語言解決多繼承問題方式(Ruby中經過混入類Mixin的方法解決)
- 經過use 關鍵字添加到其餘類的內部,增長了水平的特性的組合。
trait的一些特質
- 優先級:當前類的方式會覆蓋trait中的方法,而trait中的方法會覆蓋積累的方法
- 多個trait組合,經過逗號分隔
- 衝突解決:結局多個trait中插入了相同的方法,若沒有明確解決衝突將會產生一個致命錯誤,解決該衝突,須要使用insteadof操做符來明確指定使用衝突方法中的哪個,同時可使用as操做符將其中一個衝突的方法以另外一個名字來引入。
- 修改方法的訪問控制:使用as語法調整方法的訪問控制
- trait的抽象方法:在trait中可使用抽象成員
- trait的靜態成員:可使用靜態方法、靜態變量
- trait的屬性定義:能夠定義屬性
-
簡化三元運算符
- $var = (expr1)?(expr2):(expr3);
- 從PHP5.3起,能夠省略三元運算符的中間部分 $var = expr1 ? :expr3