定義了core這個類php
error_reporting(E_ALL);
error_reporting() 設置 PHP 的報錯級別並返回當前級別。能夠參考手冊。數組
define('IN_DISCUZ', true); define('DISCUZ_ROOT', substr(dirname(__FILE__), 0, -12)); define('DISCUZ_CORE_DEBUG', false); define('DISCUZ_TABLE_EXTENDABLE', false);
定義了4個常量,他們的做用是:函數
in_discuz: true 表示能夠經過這個文件去訪問其餘文件,不然不能獨立去訪問某些文件。spa
好比,其餘的某個文件開頭:該文件就是不能直接或者單獨被訪問的。 .net
if(!defined('IN_DISCUZ')) { exit('Access Denied'); }
discuz_root: 獲得class_core.php所在的根目錄,即source文件夾所在的目錄( source/class 恰好12個字符)。debug
dirname(): 返回路徑中的目錄部分,即一個完整的路徑,去掉文件名的部分,相似的還有
調試
basename() - 返回路徑中的文件名部分日誌
pathinfo() - 返回文件路徑的信息code
realpath() - 返回規範化的絕對路徑名對象
舉例說明: __FILE__ = F:\php-projects\Discuz32\upload\forum.php
那麼 dirname() = F:\php-projects\Discuz32\upload ; basename() = forum.php ;
pathinfo() 是個array
array (size=4) 'dirname' => string 'F:\php-projects\Discuz32\upload' (length=31) 'basename' => string 'forum.php' (length=9) 'extension' => string 'php' (length=3) 'filename' => string 'forum' (length=5)
DISCUZ_CORE_DEBUG: 設置core類的debug是否開啓,默認是false,若是須要調試,能夠手動改成true。下面緊接着就用到了。
DISCUZ_TABLE_EXTENDABLE: 未知
set_exception_handler(array('core', 'handleException'));
設置用戶自定義的異常處理函數。參數是一個數組的話,那說明這個數組的第一個元素是類名或對象名稱,第二個元素是方法名
若是發生未被捕獲的exception的時候,調用core類中的handleException方法。
函數的用途: http://www.w3school.com.cn/php/func_error_set_exception_handler.asp
if(DISCUZ_CORE_DEBUG) { set_error_handler(array('core', 'handleError')); register_shutdown_function(array('core', 'handleShutdown')); }
從上面看出,默認core的debug是關閉的,若是爲true,則調用用戶自定義的錯誤處理程序, core類的handleError方法。
register_shutdown_function()介紹:so,這個函數無論是程序執行完畢仍是程序執行出錯,最後老是會回調咱們寫的demo函數。好了,咱們能夠利用這個特性寫一個專門記錄程序執行錯誤、記錄日誌的函數。參考:http://blog.csdn.net/phpwish/article/details/7857917
if(function_exists('spl_autoload_register')) { spl_autoload_register(array('core', 'autoload')); } else { function __autoload($class) { return core::autoload($class); } }
function_exists() 檢測spl_autoload_register函數是否存在,存在的話,當new core的時候,調用 core::autoload方法來實例化core;不然執行 __autoload()函數實例化,其實也是調用core::autoload方法。
至於spl_autoload_register 和 __autoload 函數的詳細解釋,參加:http://blog.csdn.net/panpan639944806/article/details/23192267
core::autoload方法以下:
public static function autoload($class) { $class = strtolower($class); if(strpos($class, '_') !== false) { list($folder) = explode('_', $class); $file = 'class/'.$folder.'/'.substr($class, strlen($folder) + 1); } else { $file = 'class/'.$class; } try { self::import($file); return true; } catch (Exception $exc) { $trace = $exc->getTrace(); foreach ($trace as $log) { if(empty($log['class']) && $log['function'] == 'class_exists') { return false; } } discuz_error::exception_error($exc); } }
$class 經過 ‘_’被分割成2部分,前面的是文件夾,後面的是文件名。$file = ./class/.../文件名
而後導入所需的文件。若是導入出現exception,則處理之。