base.php(thinkphp目录下的base.php)代码如下:
# 1:常量的定义
//这里定义了tp5的一些基本常量
//定义了当前tp框架的版本为'5.0.21',可在任意控制器或视图echo THINK_VERSION;获取框架版本号
```
define('THINK_VERSION', '5.0.21');
```
//microtime()返回当前 Unix 时间戳的微秒数,用于对php脚本的运行计时
```
define('THINK_START_TIME', microtime(true));
```
//memory_get_usage返回当前分配给你的 PHP 脚本的内存量,单位是字节(byte)
```
define('THINK_START_MEM', memory_get_usage());
```
//定义了.php后缀
```
define('EXT', '.php');
```
// DIRECTORY_SEPARATOR,路径分隔符,linux上是 "/" windows上是 "\"
```
define('DS', DIRECTORY_SEPARATOR);
```
//判断是否定义了常量THINK_PATH,没有则定义常量THINK_PATH为根目录下\thinkphp\
```
defined('THINK_PATH') or define('THINK_PATH', __DIR__ . DS);
```
//定义了library文件夹路径,根目录下\thinkphp\library\
```
define('LIB_PATH', THINK_PATH . 'library' . DS);
```
//定义常量CORE_PATH为根目录下\thinkphp\library\think\
```
define('CORE_PATH', LIB_PATH . 'think' . DS);
```
//定义了traits文件夹路径,根目录下\thinkphp\library\traits\
```
define('TRAIT_PATH', LIB_PATH . 'traits' . DS);
```
/* $_SERVER['SCRIPT_FILENAME']获取的是当前执行脚本的绝对路径,不是当前PHP脚本所在的目录路径,
执行脚本指的是/public下的index.php,不是当前base.php文件,注意区分,dirname返回路径中的目录部分
这里APP_PATH常量在/public/index.php已经定义,
因此后面这句 define('APP_PATH', dirname($_SERVER['SCRIPT_FILENAME']) . DS)不会执行
*/
//例如输出 echo $_SERVER['SCRIPT_FILENAME'];//C:/phpStudy/PHPTutorial/WWW/ceshi1/public/index.php
//APP_PATH 在前面入口文件已经定义过
//echo realpath(APP_PATH);//C:\phpStudy\PHPTutorial\WWW\ceshi1\application
```
defined('APP_PATH') or define('APP_PATH', dirname($_SERVER['SCRIPT_FILENAME']) . DS);
```
//realpath — 返回规范化的绝对路径名
/*说明
string realpath ( string $path )
realpath() 扩展所有的符号连接并且处理输入的 path 中的 '/./', '/../' 以及多余的 '/' 并返回规范化后的绝对路径名。返回的路径中没有符号连接,'/./' 或 '/../' 成分。
失败返回:FALSE*/
//echo realpath(APP_PATH); //C:\phpStudy\PHPTutorial\WWW\ceshi1\application
/*
dirname — 返回路径中的目录部分
说明
string dirname ( string $path )
给出一个包含有指向一个文件的全路径的字符串,本函数返回去掉文件名后的目录名。
参数
path
一个路径。
在 Windows 中,斜线(/)和反斜线(\)都可以用作目录分隔符。在其它环境下是斜线(/)。
返回值
返回 path 的父目录。 如果在 path 中没有斜线,则返回一个点('.'),表示当前目录。否则返回的是把 path 中结尾的 /component(最后一个斜线以及后面部分)去掉之后的字符串。*/
//例如输出:echo dirname(realpath(APP_PATH));//C:\phpStudy\PHPTutorial\WWW\ceshi1
//判断是否定义了常量ROOT_PATH,没有则定义常量ROOT_PATH为框架application目录所在的路径
```
defined('ROOT_PATH') or define('ROOT_PATH', dirname(realpath(APP_PATH)) . DS);
```
//判断是否定义了常量EXTEND_PATH,没有则定义常量EXTEND_PATH为框架extend目录所在的路径
```
defined('EXTEND_PATH') or define('EXTEND_PATH', ROOT_PATH . 'extend' . DS);
```
//判断是否定义了常量VENDOR_PATH,没有则定义常量VENDOR_PATH为框架vendor目录所在的路径
```
defined('VENDOR_PATH') or define('VENDOR_PATH', ROOT_PATH . 'vendor' . DS);
```
//判断是否定义了常量RUNTIME_PATH,没有则定义常量RUNTIME_PATH为框架runtime目录所在的路径
```
defined('RUNTIME_PATH') or define('RUNTIME_PATH', ROOT_PATH . 'runtime' . DS);
```
//判断是否定义了常量LOG_PATH,没有则定义常量LOG_PATH为框架\runtime\log所在的路径
```
defined('LOG_PATH') or define('LOG_PATH', RUNTIME_PATH . 'log' . DS);
```
//判断是否定义了常量CACHE_PATH,没有则定义常量CACHE_PATH为框架\runtime\cache目录所在的路径
```
defined('CACHE_PATH') or define('CACHE_PATH', RUNTIME_PATH . 'cache' . DS);
```
//判断是否定义了常量TEMP_PATH,没有则定义常量TEMP_PATH为框架\runtime\temp目录所在的路径
```
defined('TEMP_PATH') or define('TEMP_PATH', RUNTIME_PATH . 'temp' . DS);
```
//判断是否定义了常量CONF_PATH,没有则定义常量CONF_PATH为框架application目录所在的路径
```
defined('CONF_PATH') or define('CONF_PATH', APP_PATH); // 配置文件目录
```
//判断是否定义了常量CONF_EXT,没有则定义常量CONF_EXT为.php后缀
```
defined('CONF_EXT') or define('CONF_EXT', EXT); // 配置文件后缀
```
//判断是否定义了常量ENV_PREFIX,没有则定义常量ENV_PREFIX为PHP_
```
defined('ENV_PREFIX') or define('ENV_PREFIX', 'PHP_'); // 环境变量的配置前缀
```
# 2: 环境变量和运行环境检测(了解即可)
// 环境常量
//PHP_SAPI 用来判断是使用命令行还是浏览器执行的,nginx下PHP_SAPI输出cgi-fcgi,命令行输出cli
```
define('IS_CLI', PHP_SAPI == 'cli' ? true : false);
```
/*strpos 函数
查找 "php" 在字符串中第一次出现的位置:
注释:字符串位置从 0 开始,不是从 1 开始
返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。*/
/*stripos() - 查找字符串在另一字符串中第一次出现的位置(不区分大小写)
strripos() - 查找字符串在另一字符串中最后一次出现的位置(不区分大小写)
strrpos() - 查找字符串在另一字符串中最后一次出现的位置(区分大小写)*/
//PHP_OS php_os 检查php运行环境
//echo PHP_OS;//WINNT
```
define('IS_WIN', strpos(PHP_OS, 'WIN') !== false);
```
# 3:载入Loader类
// 载入Loader类
```
require CORE_PATH . 'Loader.php';
```
//定义一个别名
//\think\Loader::addNamespaceAlias('model','app\index\model');
# 4:加载环境变量配置文件
// 加载环境变量配置文件
// 加载环境变量配置文件 根目录下的.env文件,默认.env文件没有,需要自行创建
```
if (is_file(ROOT_PATH . '.env')) {
$env = parse_ini_file(ROOT_PATH . '.env', true);
foreach ($env as $key => $val) {
$name = ENV_PREFIX . strtoupper($key);
if (is_array($val)) {
foreach ($val as $k => $v) {
$item = $name . '_' . strtoupper($k);
putenv("$item=$v");
}
} else {
putenv("$name=$val");
}
}
}
```
# 5:注册自动加载(下章研究核心)
// 注册自动加载
// 注册自动加载,执行上述载入\thinkphp\library\think\Loader.php文件中Loader类的register方法
```
\think\Loader::register();
```
# 6:注册错误和异常处理机制
// 注册错误和异常处理机制
/*注册错误和异常处理机制,由于当前php脚本没有Error这个类,因此触发了
\thinkphp\library\think\Loader.php文件Loader类中的register方法中
spl_autoload_register这个函数,而这个函数就会触发Loader类中的autoload方法,autoload方法会根据所该类,
找到该类对应的文件所在的目录,include进来,\think\Error会找到\thinkphp\library\think\Error.php文件
*/
```
\think\Error::register();
```
# 7:加载惯例配置文件
// 加载惯例配置文件
/* \think\Config这个类在当前文件同样找不到,因此触发了
\thinkphp\library\think\Loader.php文件Loader类中的register方法,道理同上述一样
include了 \thinkphp\library\think\Config.php文件,执行Config.php文件中Config类中set方法,
加载惯例配置文件 载入 \thinkphp\convention.php文件里的配置*/
```
\think\Config::set(include THINK_PATH . 'convention' . EXT);
```
接下来我们研究注册自动加载