二. CI3源码阅读笔记-核心文件 core/Codelgniter.php

定义框架版本

const CI_VERSION = '3.1.5';

加载常量配置文件

先从配置目录下的环境目录下加载,然后再加载config目录下的,里面定义常量代码如下:

defined('EXIT_SUCCESS') OR define('EXIT_SUCCESS', 0); // no errors

也就是说,先加载的环境目录下的文件,如果已经定义了,config目录下的将不会再次定义.从而实现了环境配置高于常规配置的效果.

设置错误处理函数

// 下面三个文件位于 框架核心目录下的 core/Common.php 文件内
set_error_handler('_error_handler');  // 错误处理函数
set_exception_handler('_exception_handler');  // 异常处理函数
register_shutdown_function('_shutdown_handler');  // 程序中止时候的函数

composer支持

如果 composer_autoload 配置项存在,则加载 vendoer/autoload.php 文件.也就是说ci3是支持composer的

加载基准测试类

该文件位置: system/core/Benchmark.php
该类可标记运行时间

  • 在此处标记了两个.key分别为 total_execution_time_startloading_time:_base_classes_start
  • 在核心类加载完成处标记. key为 loading_time:_base_classes_end
  • 控制器加载执行前. key为 controller_execution_time_{class/method}_start
  • 控制器执行结束后. key为 controller_execution_time_{class/method}_end
    多说一句: 可以使用 & load_class('Benchmark', 'core') 方式获取此对象.如果有需要的话.

加载钩子

挂载点

  • 系统开始前: pre_system
  • 文件缓存钩子: cache_override.如果有缓存文件则结束后面的流程,输出缓存文件
  • 控制器开始执行前: pre_controller
  • 控制器实例化之后: post_controller_constructor
  • 控制器方法执行完成之后: post_controller
  • 输出之前: display_override
  • 系统结束之后: post_system

其他类加载

  • UTF8环境类: system/core/Utf8.php
  • URI解析类: system/core/URI.php
  • 路由类: system/core/Route.php
  • 输出类: system/core/Output.php
  • 安全类: system/core/Security.php
  • 输入类: system/core/Input.php
  • 语言包类: system/core/Lang.php
  • 加载核心控制器类: system/core/Controller.php

配合路由执行控制器方法或者返回404

小结

  • ci3里面的是 输入类 , 注意与现代框架的 请求类 在职责和功能上的区别.这个问题等看到输入类的时候再做说明.不同的名字背后有不同的思想
  • 哐哐一顿操作,最后的目的是为了执行控制器.
  • 中间有几个钩子.由于框架核心没有自动加载,使用的是 load_class 方法手动加载的.钩子的位置决定是否可以使用某些核心类,毕竟有些类可能还没有载入.
  • 可以利用钩子做一些事情.比如想模拟某些框架的 请求中间件 .就可以在 pre_controller 钩子处实现.
posted @ 2022-01-25 17:36  乱世帝江  阅读(201)  评论(0)    收藏  举报