架构 ThinkPHP5文档学习笔记--( 二 )


驱动
系统很多的组件都采用驱动式设计 , 从而可以更灵活的扩展 , 驱动类的位置默认是放入核心类库目录下面 , 也可以重新定义驱动类库的命名空间而改变驱动的文件位置 。
行为

架构  ThinkPHP5文档学习笔记--

文章插图
行为()是在预先定义好的一个应用位置执行的一些操作 。类似于AOP【AOP面向切面编程+IOC控制反转】编程中的“切面”的概念 , 给某一个切面绑定相关行为就成了一种类AOP编程的思想 。所以 , 行为通常是和某个位置相关 , 行为的执行时间依赖于绑定到了哪个位置上 。
要执行行为 , 首先要在应用程序中进行行为侦听 , 例如:
// 在app_init位置侦听行为\think\Hook::listen('app_init');
然后对某个位置进行行为绑定:
// 绑定行为到app_init位置\think\Hook::add('app_init','\app\index\behavior\Test');
一个位置上如果绑定了多个行为的 , 按照绑定的顺序依次执行 , 除非遇到中断 。
命名空间【全限定类名】
采用了PHP的命名空间进行类库文件的设计和规划 , 并且符合PSR-4的自动加载规范 。是为了解决路径重名出现的 。
1.补充
PSR 是PHP的简称,制定的代码规范 , 简称PSR , 是代码开发的事实标准 。
PSR-4使代码更加规范 , 能够满足面向的自动加载 , 它规范了如何从文件路径自动加载类 , 同时规范了自动加载文件的位置 。
PSR-4 规范也描述了放置文件 。
系统学习PSR-4
二、生命周期
从启动应用到结束应用经历的过程 。
2.1、入口文件
用户发起的请求都会经过应用的入口文件 , 通常是 /index.php文件 。当然 , 你也可以更改或者增加新的入口文件 。
通常入口文件的代码都比较简单 , 一个普通的入口文件代码如下:
// 应用入口文件// 定义项目路径define('APP_PATH', __DIR__ . '/../application/');// 加载框架引导文件require __DIR__ . '/../thinkphp/start.php';
2.2、引导文件
接下来就是执行框架的引导文件 , start.php文件就是系统默认的一个引导文件 。在引导文件中 , 会依次执行下面操作:
start.php引导文件首先会调用base.php基础引导文件 , 某些特殊需求下面可能直接在入口文件中引入基础引导文件 。
2.3、注册自动加载
系统会调用 ::()方法注册自动加载 , 在这一步完成后 , 所有符合规范的类库(包括依赖加载的第三方类库)都将自动加载 。
// 通过base.php注册自动加载 Loader (thinkphp\library\think\Loader.php)public static function register($autoload = null){// 1、注册系统的自动加载方法 \think\Loader::autoloadspl_autoload_register($autoload ?: 'think\\Loader::autoload', true, true);// Composer 自动加载支持if (is_dir(VENDOR_PATH . 'composer')) {if (PHP_VERSION_ID >= 50600 && is_file(VENDOR_PATH . 'composer' . DS . 'autoload_static.php')) {require VENDOR_PATH . 'composer' . DS . 'autoload_static.php';$declaredClass = get_declared_classes();$composerClass = array_pop($declaredClass);foreach (['prefixLengthsPsr4', 'prefixDirsPsr4', 'fallbackDirsPsr4', 'prefixesPsr0', 'fallbackDirsPsr0', 'classMap', 'files'] as $attr) {if (property_exists($composerClass, $attr)) {self::${$attr} = $composerClass::${$attr};}}} else {self::registerComposerLoader();}}// 2、注册系统命名空间定义self::addNamespace(['think'=> LIB_PATH . 'think' . DS,'behavior' => LIB_PATH . 'behavior' . DS,'traits'=> LIB_PATH . 'traits' . DS,]);// 3、加载类库映射文件if (is_file(RUNTIME_PATH . 'classmap' . EXT)) {self::addClassMap(__include_file(RUNTIME_PATH . 'classmap' . EXT));}//4、如果存在Composer安装 , 则注册Composer自动加载self::loadComposerAutoloadFiles();// 5、注册extend(拓展类类库)目录self::$fallbackDirsPsr4[] = rtrim(EXTEND_PATH, DS);}// 加载composer autofile文件public static function loadComposerAutoloadFiles(){foreach (self::$files as $fileIdentifier => $file) {if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {__require_file($file);$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;}}}