PHP開發自己的框架,你必須知道這些知識點!
一、PHP常用的四種資料結構
簡介:spl是php的一個標準庫。
官方文件:http://php.net/manual/zh/book.spl.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
'data1' ); //入棧(先進後出)
->dequeue(); //出佇列
$heap ->extract(); //從堆中提取資料
|
二、PHP鏈式操作的實現(原理)
1、入口檔案 index.php
1 2 3 4 5 6 7 8 9 10 11 |
|
2、自動載入類 Loader.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
3、資料庫類Database.php
注:只是原理,並沒有對方法進行具體的封裝,具體的封裝還是看個人喜好去定鏈式查詢的風格。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
|
其實就是對傳過來的條件進行重新的底層封裝,然後再把當前物件返回,使得可以不斷的鏈式查詢。
三、PHP魔術方法的使用
在php設計模式中,會涉及到很多魔術方法的使用,這裡也對經常會用到的魔術方法進行簡單總結。
1、框架入口檔案 index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
|
2、 Extend/Object.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
|
四、三種基礎設計模式
1、工廠模式
通過傳入引數的不同,來例項化不同的類。
index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
Extend/CacheFactory.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
|
2、單例模式
保證一個類只例項化一個類物件,進而減少系統開銷和資源的浪費
index.php
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Extend/SingleObject.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
3、註冊樹模式
將我們用到的物件註冊到註冊樹上,然後在之後要用到這個物件的時候,直接從註冊樹上取下來就好。(就和我們用全域性變數一樣方便)
Extend/RegisterTree,php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
|
五、其他常見的8種PHP設計模式
1、介面卡模式
將一個類的介面轉換成客戶希望的另一個介面,介面卡模式使得原本的由於介面不相容而不能一起工作的那些類可以一起工作。
應用場景:老程式碼介面不適應新的介面需求,或者程式碼很多很亂不便於繼續修改,或者使用第三方類庫。
常見的有兩種介面卡,分別是類介面卡和物件介面卡,這裡拿更看好的物件介面卡舉例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
|
2、策略模式
將一組特定的行為和演算法封裝成類,以適應某些特定的上下文環境,這種模式就是策略模式,策略模式可以實現依賴倒置以及控制反轉。
例項舉例:假如一個電商網站系統,針對男性女性使用者要各自跳轉到不同的商品類目,並且所有的廣告位展示展示不同的廣告。
index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
|
Extend/userType.php(定義的介面)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
MaleUserType.php、FemaleUserType.php(具體實現的類 )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
顯示效果:
3、資料物件對映模式
將物件和資料儲存對映起來,對一個物件的操作會對映為對資料儲存的操作。
下面在程式碼中實現資料物件對映模式,我們將實現一個ORM類,將複雜的sql語句對映成物件屬性的操作。並結合使用資料物件對映模式、工廠模式、註冊模式。
-----(1)資料庫對映模式簡單例項實現
index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
Extend/User.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
這樣,執行index.php檔案,資料庫就會發生相應的操作,也就實現了基本的資料物件對映。
-------(2)資料庫對映模式複雜案例實現
index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|
Extend/Factory.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
|
Extend/Register.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
|
Extend/User.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
這樣,就實現了稍複雜的資料物件對映模式和工廠模式、註冊樹模式相結合的案例。
4、觀察者模式
當一個物件狀態發生改變時,依賴它的物件會全部收到通知,並自動更新。
場景:一個事件發生後,要執行一連串更新操作。傳統的程式設計方式就是在事件的程式碼之後直接加入處理邏輯,當更新的邏輯增多之後,程式碼會變的難以維護。這種方式是耦合的,侵入式的,增加新的邏輯需要修改事件主體的程式碼。觀察者模式實現了低耦合,非侵入式的通知與更新機制。
4.1、傳統模式舉例:
<?php /** * 框架入口檔案 */ define('BASEDIR',__DIR__);//專案根目錄 include BASEDIR.'/Extend/Loader.php';//引入專案自動載入類檔案 spl_autoload_register('\\Extend\\Loader::autoload');//執行自動載入函式,完成類的自動載入 /** * 一個事件的邏輯控制器 * Class Event */ class Event { /** * 使用者確認訂單 */ function firmOrder() { //這裡假設一個事件發生了,比如使用者已經完成下單 echo "使用者已下單<br>"; //傳統方式是在發生一個事件之後直接進行一系列的相關處理,耦合度比較高,比如寫入日誌,給使用者發郵件等等 echo "在使用者下單之後進行的一系列操作<br>"; } } $event = new Event(); $event->firmOrder();
4.2、觀察者模式典型實現方式:
(1)定義2個介面:觀察者(通知)介面、被觀察者(主題)介面
(2)定義2個類,觀察者類實現觀察者介面、被觀察者類實現被觀察者介面
(3)被觀察者註冊自己需要通知的觀察者
(4)被觀察者類某個業務邏輯發生時,通知觀察者物件,進而每個觀察者執行自己的業務邏輯。
程式碼示例:
test.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
|
瀏覽器顯示結果:
5、原型模式
原型模式與工廠模式的作用類似,都是用來建立物件的。但是實現方式是不同的。原型模式是先建立好一個原型物件,然後通過clone原型物件來建立新的物件。這樣,就免去了類建立時重複的初始化操作。
原型模式適用於大物件的建立,建立一個大物件需要很大的開銷,如果每次new就會消耗很大,原型模式僅需記憶體拷貝即可。
程式碼例項:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
|
瀏覽器顯示結果:
6、裝飾器模式
可以動態的新增或修改類的功能
一個類實現一個功能,如果要再修改或新增額外的功能,傳統的程式設計模式需要寫一個子類繼承它,並重新實現類的方法。
使用裝飾器模式,僅需在執行時新增一個裝飾器物件即可實現,可以實現最大的靈活性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
|
7、迭代器模式
在不需要了解內部實現的前提下,遍歷一個聚合物件的內部元素而又不暴露該物件的內部表示,這就是PHP迭代器模式的定義。
相對於傳統程式設計模式,迭代器模式可以隱藏遍歷元素的所需的操作。
index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
Extend/AllUser.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
|
8、代理模式
在客戶端與實體之間建立一個代理物件(proxy),客戶端對實體進行操作全部委派給代理物件,隱藏實體的具體實現細節。
典型的應用就是mysql的主從結構,讀寫分離。在mysql中,對所有讀的操作請求從庫,所有寫的操作請求主庫。
宣告一個代理類,前臺使用時只需建立一個代理類,呼叫對應方法即可。程式碼例項:
index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
Extend/Proxy.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
Extend/Factory.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
Extend/Application.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
Extend/Config.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
|
configs/database.php
<?php $config = array( 'master' => array( 'type' => 'MySQL', 'host' => '127.0.0.1', 'user' => 'root', 'password' => '123456', 'dbname' => 'test', ), 'slave' => array( 'slave1' => array( 'type' => 'MySQL', 'host' => '127.0.0.1', 'user' => 'root', 'password' => '123456', 'dbname' => 'test', ), 'slave2' => array( 'type' => 'MySQL', 'host' => '127.0.0.1', 'user' => 'root', 'password' => '123456', 'dbname' => 'test', ), ), ); return $config;
五、其餘設計模式以及總結
六、面向物件程式設計的基本原則
1、單一職責原則:一個類只需要做好一件事情。不要使用一個類完成很多功能,而應該拆分成更多更小的類。
2、開放封閉原則:一個類寫好之後,應該是可擴充套件而不可修改的。
3、依賴倒置原則:一個類不應該強依賴另外一個類,每個類對於另外一個類都是可替換的。
4、配置化原則:儘量使用配置,而不是硬編碼。
5、面向介面程式設計原則:只需要關心某個類提供了哪些介面,而不需要關心他的實現。
七、自動載入配置類檔案
1、php中使用ArrayAccess實現配置檔案的載入(使得程式可以以陣列的方式進行讀取配置)
(1)定義Config.php,繼承php自帶的ArrayAccess介面,並實現相應的方法,用於讀取和設定配置
Extend/Config.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
|
(2)configs/database.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
(3)讀取配置
index.php
1 2 3 4 5 6 7 8 9 10 |
|
(4)瀏覽器顯示:
到此,就可以在程式中隨心所欲的載入配置檔案了。
2、在工廠方法中讀取配置,生成可配置化的物件
Extend/Factory.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
Extend/Application.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
Extend/Config.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
|
以上就是PHP開發自己的框架,你必須知道這些知識點!的詳細內容,更多請關注php中文網其它相關文章!