一开始的ThinkPHP.php 最后一行代码 就是 Think::start();
调用了 Think.class.php 的 start()方法
static public function start() {
// 设定错误和异常处理
register_shutdown_function(array('Think','fatalError'));
set_error_handler(array('Think','appError'));
set_exception_handler(array('Think','appException'));
// 注册AUTOLOAD方法
spl_autoload_register(array('Think', 'autoload'));
//[RUNTIME]
Think::buildApp(); // 预编译项目
//[/RUNTIME]
// 运行应用
App::run();
return ;
}
这个类最重要的是三部分
1、注册错误、异常的处理方法
register_shutdown_function、set_error_handler、set_exception_handler
2、自动加载
if(substr($class,-8)=='Behavior') { // 加载行为
if(require_array(array(
CORE_PATH.'Behavior/'.$file,
EXTEND_PATH.'Behavior/'.$file,
LIB_PATH.'Behavior/'.$file,
$libPath.'Behavior/'.$file),true)
|| (defined('MODE_NAME') && require_cache(MODE_PATH.ucwords(MODE_NAME).'/Behavior/'.$file))) {
return ;
}
}
节选代码,主要的写法 就是 根据类名的后缀 如 abcBehavior 这搜索默认Behavior的文件夹里 有没有对应的类文件
找到了 就return
没有找到,则
// 根据自动加载路径设置进行尝试搜索
$paths = explode(',',C('APP_AUTOLOAD_PATH'));
foreach ($paths as $path){
if(import($path.'.'.$class))
// 如果加载类成功则返回
return ;
}
3、编译项目
其实即使将 runtime.php 流程中定义的常量和应用的文件 都包含在了一个文件中 ~runtime.php
这样可以加快运行速度,减少io开销