首先需要掌握一些知识点:
常量定义
常量主要用来存储系统中不变动的值,比如说根目录。
defined('经理') or define('经理','小明');
意思是有没有经理,没有,小明你来当经理
命名空间
起名字是大事,估计很少有人家孩子会起名叫“小明”。这个名字太通俗。如果一个班上,七八个小明。老师也蒙圈了。命名空间解决的就是这个问题。
魔术方法
php中有好多“__”开头的方法被称为魔术方法。感觉很神奇似的,这个东西听起来很悬,其实很简单。比如下面的__autoload(),在php程序中定义好的类就直接引用类所在的文件就可以了,如果定义的类太多,引入的文件太多怎么办,很不方便。__autoload()就能帮你了。把没载入的类文件载入进来。
如果用集合理解就是,定义了一个已知集合,定义了一个未知集合。php中的魔术方法就是为未知这个集合提供操作的方法。
类的自动加载
__autoload()
spl_autoload_register()
了解require和include的区别
require是无条件包含,文件不存在则报错退出。不再执行。多用于文件开头
include是可商量的,文件不存在则警告,继续执行。多用于条件判断中
然后从入口文件开始,像掰洋葱一点一点把它吃掉。
入口文件:
// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';
start.php: 在这里引用了一个base.php
// ThinkPHP 引导文件
// 1. 加载基础文件
require __DIR__ . '/base.php';
// 2. 执行应用
App::run()->send();
base.php:这个文件有点不堪了,咋办,只摘重点
//想看定义了啥直接看文档 https://www.kancloud.cn/manual/thinkphp5/118137
//路径常量
//系统常量
// 载入Loader类
require CORE_PATH . 'Loader.php';
...
// 注册自动加载
\think\Loader::register();
// 注册错误和异常处理机制
\think\Error::register();
// 加载惯例配置文件,写的很不堪,其实就是加载了个convention.php而已。
//set是Config类是静态方法,THINK_PATH是thinkphp所在的主目录,EXT是扩展名.php
\think\Config::set(include THINK_PATH . 'convention' . EXT);
现在是不是接下来想看Loader.php呢?错(不能一下子深入下去,会迷路的)
我们要回头去看App::run()->send();
App::run() 主要看两个东西,第一传了什么,第二返回了什么。
/**
* 执行应用程序
* @access public
* @param Request $request 请求对象
* @return Response
* @throws Exception
*/
public static function run(Request $request = null)
$request = is_null($request) ? Request::instance() : $request;
...
return $response;
传进了个Request对象,其实你不传值,它会实例化一个。
返回了个Reponse对象
Response->send()
/**
* 发送数据到客户端
* @access public
* @return mixed
* @throws \InvalidArgumentException
*/
public function send(){
...
// 清空当次请求有效的数据
if (!($this instanceof RedirectResponse)) {
Session::flush();
}
}
貌似已经结束了。哦。。。
此时此刻是不是很想知道run(),send()这两个小家伙都干了些啥呢?