美文网首页
thinkphp5源码分析1

thinkphp5源码分析1

作者: php_study | 来源:发表于2018-04-23 13:40 被阅读0次

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

    常量主要用来存储系统中不变动的值,比如说根目录。
    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

          本文链接:https://www.haomeiwen.com/subject/sctllftx.html