日誌,mysql事物操作
建立一個入口檔案index.php
建立檔案目錄結構
Config :配置檔案
Controller :控制器檔案
Model :模型檔案
Vendor :系統檔案以及類檔案
Log :日誌目錄
入口檔案:
初始化檔案
Vendor\init.php
Defined:判斷常量是否被定義,被定義返回true 否則 返回 false
|| :或的關係
從左至右執行;
如果左側的返回值為true,整個表示式返回true繼續向下執行
如果左側的返回值為false,會執行右側的表示式,利用這個規則,定義常量,功能與如下程式碼類似:
自動載入檔案
Vendor\autoload.php
類檔案中定義名稱空間
通過名稱空間與__autoload魔術方法,實現類檔案自動載入
當例項化一個不存在的類的時候,會自動執行__autoload()函式,類名(名稱空間)會以引數的形式傳遞到__autoload方法中,我們就可以通過名稱空間與類名找到想要例項化的類的位置,並且引入
Namespace 定義類檔案的空間位置
Use 可以引入名稱空間的類
常量配置檔案Config\const.php
$_SERVER[‘REQUEST_TIME’] :獲取當前請求的時間 可以代替 time()
自定義函式檔案
Vendor\function.php
定義一些常用的並且需要全域性呼叫函式
配置檔案
Config\config.php
通用配置
引用init.php程式碼片段
Include會將引入檔案的陣列返回,這裡面將陣列賦值給了$GLOBALS變數(超全域性變數)
控制器檔案
Controller\Controller.class.php
__call:魔術方法,呼叫類中不存在的方法時自動呼叫,並且以引數的形式傳遞給__call 方法的名稱以及引數
呼叫const.php的程式碼片段
這裡面定義了一個統一的方法的字尾名為Action
我們定義控制器方法的時候,需要在正常的方法名後面增加Action
我們呼叫的時候不帶字尾呼叫,引入index.php程式碼片段
正常情況下呼叫create方法會報方法不存在的錯誤,但是我們定義了__call,會將呼叫的方法名稱與引數傳遞過來,進入__call方法,接下來就解析一下__call方法:
將真正的方法名稱拼接出來
例項化Model物件,用於呼叫事務方法
Try catch結構可以捕捉並處理異常,try中寫入邏輯程式碼,當執行出現異常時,系統自動獲取異常資訊並進入catch結構中,將錯誤資訊傳遞給 \Exception $e中的$e變數中
為什麼Exception類需要\呼叫,因為當前類檔案使用了名稱空間,那麼在這個檔案中呼叫或者例項化任何類,都回在當前的名稱空間去尋找相當於: \Controoler\Exception 如此這般呼叫,顯然是找不到的。
如果我們在類的前面增加\,那麼就是告訴系統我們要在根名稱空間中呼叫類
事務:使用事務配合Try catch使用的話,那麼必然要在Model中封裝異常處理
封裝的原理:利用__call方法,將事務與日誌處理封裝,所有執行的方法,全部在事務的包含裡,這樣的話就不需要重複的寫相同的程式碼,減少了程式碼量,提高程式碼閱讀效率
那麼這個引數中的...是什麼意思呢?
如果我們不知道要傳遞的引數的數量是多少,那麼我們就將這個引數以陣列的形式傳遞,並且在實參的前面增加...,這樣的效果就會將陣列中所有的值,作為單個的引數傳遞到形參中,程式碼如上
如果我們不確定要接收的引數的數量是多少,也可以用...來表示,形式為:
這樣的話,形參會以陣列的形式將所有的引數全部的合併到陣列(索引陣列)中,我們可以迴圈獲取引數
資料庫操作類
Model\Model.class.php
Model中的建構函式:
我們在這裡通過獲取$GLOBALS變數中的資料庫配置,連結資料庫
事務處理方法
錯誤處理方法
ErrorInfo 就是PDO類中的獲取錯誤資訊的方法
當執行這個方法的時候,證明sql執行錯誤了,為了處理相關錯誤資訊,配合我們Try catch使用,我們需要丟擲一個異常供try catch捕捉
丟擲異常的方法
\Vendor\ExceptionHandler這個類為自定義類,為了方便異常處理,提供我們日誌想要的資料,我們需要重寫Exception類,我們通過面向物件中多型特性,對父類中的值或者方法進行重寫,重寫的程式碼如下:
Debug_backtrace()方法, 產生一條回溯跟蹤,獲取錯誤的位置,重新定義錯誤檔案位置以及行數
日誌處理類
Vendor\Log.class.php
使用檔案鎖實現抗併發的寫入
Flock:檔案鎖定,可實現共享鎖定與排他鎖定
共享鎖:鎖共享機制,可併發讀取,無法併發寫入,其他連結對共享鎖檔案執行寫入觸發等待,鎖釋放後放可寫入
排他鎖:鎖排他機制,無法併發讀取、寫入,如果檔案已經處於排他鎖定階段,其他連結獲取鎖會等待鎖釋放後方可
靜態定義,靜態呼叫,執行速度快,記憶體消耗大
Array_keys_exists(key, array); 檢查給定的鍵名或索引是否存在於陣列中