说好的应用初始化
上回书说到 ThinkPHP 框架入口文件,加载了框架Think.class.php
,并执行了静态方法start()
。那么在start()
这个静态方法中,又做了哪些呢?
本回书继续说道说道。
应用初始化做什么?
如下步骤:
注册AUTOLOAD方法
spl_autoload_register('Think\Think::autoload');
使用spl_autoload_register
注册了Think\Think::autoload
这个静态方法,当类不存在的时候调用这个方法,以自动加载不存在的类。
设定错误和异常处理
register_shutdown_function('Think\Think::fatalError');
set_error_handler('Think\Think::appError');
set_exception_handler('Think\Think::appException');
当 PHP 终止执行的时候,当 PHP 执行错误的时候,当 PHP 抛出异常的时候,一直这些函数设定的静态方法,来处理错误与异常。
初始化文件存储方式
Storage::connect(STORAGE_TYPE);
这里的STORAGE_TYPE
的值有两种可能,分别是Sae
或者File
。
SAE 是新浪云平台,由于不支持直接写入文件,所以这里定义了 SAE 的模式。
加载核心文件
加载什么核心文件呢?
$mode = include is_file(CONF_PATH.'core.php')?CONF_PATH.'core.php':MODE_PATH.APP_MODE.'.php';
吐槽一下这种写法,不直观,我觉得应该在写成
include()
,而不是include
。
如果/ThinkPHP/Think/core.php
不存在,那么加载/ThinkPHP/Model/common.php
。
foreach ($mode['core'] as $file){
if(is_file($file)) {
include $file;
if(!APP_DEBUG)
$content .= compile($file);
}
}
这里的$file
都是写什么?我们来看看/ThinkPHP/Modle/common.php
。
'core' => array(
THINK_PATH.'Common/functions.php',
COMMON_PATH.'Common/function.php',
CORE_PATH . 'Hook'.EXT,
CORE_PATH . 'App'.EXT,
CORE_PATH . 'Dispatcher'.EXT,
//CORE_PATH . 'Log'.EXT,
CORE_PATH . 'Route'.EXT,
CORE_PATH . 'Controller'.EXT,
CORE_PATH . 'View'.EXT,
BEHAVIOR_PATH . 'BuildLiteBehavior'.EXT,
BEHAVIOR_PATH . 'ParseTemplateBehavior'.EXT,
BEHAVIOR_PATH . 'ContentReplaceBehavior'.EXT,
),
引入了function
文件,终于可以使用dump()
函数了,真高兴。之后的代码中可以看到例如C()
这样的单字母大写函数了。
终于看到Route
、Controller
以及View
这些单词了,距离 MVC 还远吗?
加载核心的配置文件:
foreach ($mode['config'] as $key=>$file){
is_numeric($key)?C(load_config($file)):C($key,load_config($file));
}
哪些核心的配置文件:
'config' => array(
THINK_PATH.'Conf/convention.php', // 系统惯例配置
CONF_PATH.'config'.CONF_EXT, // 应用公共配置
),
然后需要加载用户的配置文件:
foreach ($mode['config'] as $key=>$file){
is_numeric($key)?C(load_config($file)):C($key,load_config($file));
}
加载模式别名定义
加载应用别名定义文件
加载模式行为定义
加载应用行为定义
加载框架底层语言包
读取当前应用状态对应的配置文件
设置系统时区
date_default_timezone_set(C('DEFAULT_TIMEZONE'));
设定用于一个脚本中所有日期时间函数的默认时区。
检查应用目录结构
检查目录的结构,如果不存在,则创建。
if(C('CHECK_APP_DIR')) {
$module = defined('BIND_MODULE') ? BIND_MODULE : C('DEFAULT_MODULE');
if(!is_dir(APP_PATH.$module) || !is_dir(LOG_PATH)){
// 检测应用目录结构
Build::checkDir($module);
}
}
记录加载文件时间
G('loadTime');
运行应用
App::run();