1. 程式人生 > >日誌,mysql事物操作

日誌,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); 檢查給定的鍵名或索引是否存在於陣列中