body
#blog-calendar
p, blockquote, ul, ol, dl, table, pre
h1, h2, h3, h4, h5, h6
h1 tt, h1 code, h2 tt, h2 code, h3 tt, h3 code, h4 tt, h4 code, h5 tt, h5 code, h6 tt, h6 code
h1 h2
h3 h4
h5 h6
body>h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h4:first-child, body>h5:first-child, body>h6:first-child
a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6
h1+p, h2+p, h3+p, h4+p, h5+p, h6+p
a a:hover
ul, ol
ul li>:first-child, ol li>:first-child, ul li ul:first-of-type, ol li ol:first-of-type, ul li ol:first-of-type, ol li ul:first-of-type
ul ul, ul ol, ol ol, ol ul
dl dl dt
dl dt:first-child
dl dt>:first-child
dl dt>:last-child
dl dd
dl dd>:first-child
dl dd>:last-child
pre, code, tt
code, tt
pre>code
pre
pre code, pre tt
kbd
blockquote
blockquote>:first-child
blockquote>:last-child
hr table th
table th, table td
table tr
table tr:nth-child(2n)
img
說到寫php的mvc框架,大家想到的第乙個詞--「造輪子」,是的,乙個還沒有深厚功力的程式設計師,寫出的php框架肯定不如那些出自大神們之手、經過時間和各種專案考驗的框架。但我還是準備並且這麼做了,主要是因為:
所以說,這次造輪子的目的不是為了造輪子而是為了在造輪子的過程中熟悉其工藝,總結輪子特點,更好的使用輪子。
如果說寫乙個完整的php框架,那需要掌握的php知識點非常多,像設計模式、迭代器、事件與鉤子等等,還有許多基礎知識的靈活應用。我自認為這些還無法完全掌控,所以我的步驟是先自己搭建乙個骨架,然後參考借鑑不同的php框架的特點,將其慢慢完善。因為工作原因,而且晚上還要補演算法、網路等程式設計基礎,php框架部分可能只有週末有時間更新,我會在進行框架功能更新之後,總結使用的知識點,更新博文。
首先放上框架的目前原始碼:github/zhenbianshu
首先自己總結一下php的mvc框架的工作流程:
簡單來說,它以乙個入口檔案來接受請求,選擇路由,處理請求,返回結果。
當然,幾句話總結完的東西實際上要做的工作很多,php框架會在每次接受請求時,定義常量,載入配置檔案、基礎類,根據訪問的url進行邏輯判斷,選擇對應的(模組)控制器和方法,並且自動載入對應類,處理完請求後,框架會選擇並渲染對應的模板檔案,以html頁面的形式返回響應。在處理邏輯的時候,還要考慮到錯誤和異常的處理。
1、作為mvc框架,一定要有乙個唯一的入口檔案來統領全域性,所有的訪問請求都會首先進入這個入口檔案,如我框架根目錄的index.php,在裡面,我定義了基本資料夾路徑,當前環境,並根據當前環境定義錯誤報告的級別。
2、php中載入另外的檔案,使用require和include,它們都是將目標檔案內容載入到當前檔案內,替換掉require或include語句,require是載入進來就執行,而include是載入進來在需要的時候執行,而它們的_once結構都是表示在寫多次的時候只執行一次。
3、框架內的配置變數等使用專用的配置檔案來儲存,這裡我仿照了tp裡的陣列返回法,用了乙個compileconf()函式來解析陣列,將陣列的鍵定義為常量,值為陣列的值。
if (!function_exists('compile_conf')) else}}
} compileconf(require_once conf_path.'config.php');
為什麼把命名空間和自動載入放到一塊說呢?
在乙個php專案中,類特別多的時候,如果類名重複的話就會造成混亂,而且相同資料夾內也不能存在同名的檔案,所以這時候命名空間和資料夾就搭檔出場了。資料夾就是乙個乙個的盒子,命名空間在我理解就像是乙個標籤,盒子對應標籤。我們定義類時,把各種類用不同的盒子分別裝好,並貼上對應的標籤。而在自動載入類時,我們根據標籤(命名空間)可以很輕易找到對應的盒子(資料夾)然後找到對應的類檔案。
而類的自動載入,我們知道的__autoload()魔術函式,它會在你例項化乙個當前路徑找不到的物件時自動呼叫,根據傳入的類名,在函式體內載入對應的類檔案。
現在我們多用spl_autoload_register()函式,它可以註冊多個函式來代替__autoload函式的功能,我們傳入乙個函式名為引數,spl_autoload_register會將這個函式壓入棧中,在例項化乙個當前路徑內找不到的類時,系統將會將函式出棧依次呼叫,直到例項化成功。
spl_autoload_register('sqier\loader::autoload');
class loader
return;
}}
現在loader類還是乙個簡單的類,待以後慢慢完善。
接下來就是路由選擇了,其本質是根據當前定義的全域性url模式選擇合適的方法來分析傳入的uri,載入對應的類,並實現對應的方法。
class router
default:
}}public static function rboot()
}
接下來我會優化現有的工具類,新增顯示層,新增資料庫類,還會將一些別的框架裡非常cool的功能移植進來~
待續...
搭建自己的PHP框架心得(一)
說到寫php的mvc框架,大家想到的第乙個詞 造輪子 是的,乙個還沒有深厚功力的程式設計師,寫出的php框架肯定不如那些出自大神們之手 經過時間和各種專案考驗的框架。但我還是準備並且這麼做了,主要是因為 所以說,這次造輪子的目的不是為了造輪子而是為了在造輪子的過程中熟悉其工藝,總結輪子特點,更好的使...
搭建自己的PHP框架
現在web應用普遍使用的是mvc設計模式,即模型 model 檢視 view 和控制器 controller 搭建框架首先要明白三者的聯絡,我們可以設計乙個單入口檔案模式,具體流程是 index.php 獲取引數得到controller控制器名,method方法名,param引數 構造控制器 構造相...
PHP搭建自己的MVC框架 2
mvc工作流程初步認識 第一步 訪問者 呼叫控制器 發出指令 第二步 控制器 按指令選取合適的模型 第三步 模型 安控制器發出的指令獲取相應的資料 第四步 控制器 按照指令選取相應的檢視 第五步 檢視 將第三步渠道的資料通過控制器傳遞給檢視資料按使用者想要的樣子展示出來 1 首先我們需要有乙個入口檔...