前三篇文章已經把MVC的結構原理都簡單的進行了說明和演示。。。當然,不是說一個框架就只有那點東西,一個良好的框架所要求的功能還是要很全面的,例如友好的錯誤輸出,安全處理,防止跨域攻擊等
好了,我們一步一步來。這節要說的是錯誤捕捉,其實這個不難,只要理解2個方法就可以做好錯誤捕捉的程序。
代碼如下 復制代碼
register_shutdown_function(‘functionname’);
set_error_handler(‘functionname’);
第一個方法,是注冊一個shutdown的回調函數,當php腳本關閉時調用,當然這個關閉可以是正常的代碼執行完畢,也可以是程序拋出致命錯誤關閉的腳本,那我怎麼區分呢?別急,php還有一個方法叫error_get_last() 就像函數名說的那樣,獲取php最後一個錯誤信息,這樣就可以判斷是代碼正常執行完畢還是遇到fatal error。。。
第二個方法,是注冊一個error的回調函數,當腳本執行遇到錯誤時調用。
這2個方法最大的區別是,第一個是腳本關閉調用,也就是1次訪問,只會調用一次(因為發生致命錯誤腳本就退出執行了),二第二個方法的觸發調用是發生錯誤的時候,例如訪問數組中不存在的index,使用未定義的變量,就是這些warning,notice錯誤的捕捉。。。如果你想更了解二者的區別,建議訪問php官網查看文檔說明。。。
這裡我就不貼代碼了,有興趣的同學,可以去github那裡下回來慢慢看。。。
代碼如下 復制代碼
<?php
# 定義application路徑
define('APPPATH', trim(__DIR__,'/'));
# 獲得請求地址
$root = $_SERVER['SCRIPT_NAME'];
$request = $_SERVER['REQUEST_URI'];
$URI = array();
# 獲得index.php 後面的地址
$url = trim(str_replace($root, '', $request), '/');
# 如果為空,則是訪問根地址
if (empty($url))
{
# 默認控制器和默認方法
$class = 'Index';
$func = 'welcome';
}
else
{
$URI = explode('/', $url);
# 如果function為空 則默認訪問index
if (count($URI) < 2)
{
$class = ucfirst($URI[0]);
$func = 'index';
}
else
{
$class = ucfirst($URI[0]);
$func = $URI[1];
}
}
# 把class加載進來
include(APPPATH . '/' . 'application/controllers/' . $class . '.php');
#實例化
$obj = new $class;
call_user_func_array(
# 調用內部function
array($obj,$func),
# 傳遞參數
array_slice($URI, 2)
);
我們來看看最終的效果。。。我們來試試訪問不存在的controller裡的方法試試
先看看沒有錯誤捕捉的時候:
再來對比下做了錯誤捕捉的時候