thinkphp5.0自动加载

摘要:
概述ThinkPaPHP 5.0真正实现了按需加载。所有类库都采用自动加载机制,并支持类库映射和作曲家类库的自动加载。自动加载的实现由thinkLoader类库完成,自动加载规范符合PHP的PSR-4。类库的自动加载检测顺序如下:1.类库映射检测;2.PSR-4自动加载检测;3.PSR-0自动加载检测;系统将按顺序检测。一旦检测生效,将自动加载相应的类库文件。Composer 5.0版的自动加载支持自动加载Composer安装的类库。您可以根据Composer依赖关系库中的名称空间直接调用它。

概述

ThinkPHP5.0 真正实现了按需加载,所有类库采用自动加载机制,并且支持类库映射和composer类库的自动加载。

自动加载的实现由thinkLoader类库完成,自动加载规范符合PHP的PSR-4

自动加载

由于新版ThinkPHP完全采用了命名空间的特性,因此只需要给类库正确定义所在的命名空间,而命名空间的路径与类库文件的目录一致,那么就可以实现类的自动加载。

类库的自动加载检测顺序如下:

1、类库映射检测;
2、PSR-4自动加载检测;
3、PSR-0自动加载检测;

系统会按顺序检测,一旦检测生效的话,就会自动载入对应的类库文件。

类库映射

遵循我们上面的命名空间定义规范的话,基本上可以完成类库的自动加载了,但是如果定义了较多的命名空间的话,效率会有所下降,所以,我们可以给常用的类库定义类库映射。命名类库映射相当于给类文件定义了一个别名,效率会比命名空间定位更高效,例如:

Loader::addClassMap('thinkLog',LIB_PATH.'thinkLog.php');
Loader::addClassMap('orgutilArray',LIB_PATH.'orgutilArray.php');

也可以利用addClassMap方法批量导入类库映射定义,例如:

$map = [
    'thinkLog'     =>  LIB_PATH.'thinkLog.php',
    'orgutilarray'=>  LIB_PATH.'orgutilArray.php'
];
Loader::addClassMap($map);

虽然通过类库映射的方式注册的类可以不强制要求对应命名空间目录,但是仍然建议遵循PSR-4规范定义类库和目录。

类库导入

如果你不需要系统的自动加载功能,又或者没有使用命名空间的话,那么也可以使用thinkLoader类的import方法手动加载类库文件,例如:

Loader::import('org.util.array');
Loader::import('@.util.upload');

示例

// 引入 extends/qrcode.php
Loader::import('qrcode', EXTEND_PATH);
// 助手函数
import('qrcode', EXTEND_PATH);

// 引入 extends/wechat-sdk/wechat.class.php
Loader::import('wechat-sdk.wechat', EXTEND_PATH, '.class.php');
// 助手函数
import('wechat-sdk.wechat', EXTEND_PATH, '.class.php');

类库导入也采用类似命名空间的概念(但不需要实际的命名空间支持),支持的“根命名空间”包括:

目录说明
behavior系统行为类库
think核心基类库
traits系统Traits类库
app应用类库
@表示当前模块类库包

如果完全遵从系统的命名空间定义的话,一般来说无需手动加载类库文件,直接实例化即可。

Composer自动加载

5.0版本支持Composer安装的类库的自动加载,你可以直接按照Composer依赖库中的命名空间直接调用。

免责声明:文章转载自《thinkphp5.0自动加载》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[vuex] unknown mutation type:hw1 problem2下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

thinkphp5.0命名空间

命名空间 ThinkPHP采用命名空间方式定义和自动加载类库文件,有效的解决了多模块和Composer类库之间的命名空间冲突问题,并且实现了更加高效的类库自动加载机制。 如果不清楚命名空间的基本概念,可以参考PHP手册:PHP命名空间 特别注意的是,如果你需要调用PHP内置的类库,或者第三方没有使用命名空间的类库,记得在实例化类库的时候加上 ,例如: /...

php自动加载规范 PSR4 (Thinkphp)

PSR4是一种自动加载规范,老版本是PSR0,尽管thinkPHP支持PSR4和PSR0的自动加载方式,但是默认也是优先进行PSR4加载,如果失败,再进行PSR0的加载。本篇文章只会讨论PSR4的加载。 代码示例: spl_autoload_register(function ($class) { // 指定项目的命名空间前缀 $p...

留言板小程序开发笔记-4

前端多个html文件, 共用变量的时候, 使用cookie, 或者在多个页面之间通过 url传递变量... 前端多个html页面之间, 可以共用一个css文件, 因为, 在不同的页面包含同一个css文件, 即使另一个页面,不包含某些 dom节点的时候, 它不会出错, 而且也会自动执行. 而多个html文件,共用一个 js 文件时, 由于不同文档的dom结...

命名空间详解和分类

命名空间是什么 计算机科学领域中是通过名字来使用各种代码资源(变量和子程序)的,命名空间(namespace)则是组织这些资源的一组符号,例如目录树是就硬盘上文件们的命名空间。命名空间的设计目的是提供一种让一组名称与其他名称分隔开的方式。在一个命名空间中声明的类的名称与另一个命名空间中声明的相同的类的名称不冲突。 如果你还是无法获得命名空间的概念,你只要想...

tp5.1自动加载机制

前言     最近在学习TP5.1.37 框架内核,想把自己所学到的写下来,这样可以检测自己到底学到了多少,理解了多少。写的有不对的地方或者有不严谨的地方,还望大佬指正,谢谢。 正文 index.php 入口文件引入自动加载类Loader     TP5.1入口文件引入加载了base.php文件,然后base.php文件中载入了Loader.php类,并且...

PHP 命名空间

概述 什么是命名空间呢? 这个概念我第一次知道是在C++中. 首先, 为什么要用到命名空间呢? 当然是为了解决重名的问题了, 其实命名空间和Java中的包有着异曲同工之妙, Java中 a包下的Test类, 和b包下的Test类是两个类, 在使用的时候import不同包下即可, PHP中 a命名空间下的Test类,与b命名空间下的Test类也是两个类.  ...