定义了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,则处理之。