thinkphp5源码分析1

首先需要掌握一些知识点:
常量定义

常量主要用来存储系统中不变动的值,比如说根目录。
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()这两个小家伙都干了些啥呢?

你可能感兴趣的:(thinkphp5源码分析1)