定义:

惰性加载:一个类只有在使用的时候才include(require)进来。

优点:减少内存占用,提高系统整体速度。

在tp3.2.3的时候,核心的文件是统一加载的。

在think.class.php的start方法中可以看到:

foreach ($mode['core'] as $file){

if(is_file($file)) {

include $file;

if(!APP_DEBUG) $content .= compile($file);

}

}而变量$mode为应用模式:

$mode = include is_file(CONF_PATH.'core.php')?CONF_PATH.'core.php':MODE_PATH.APP_MODE.'.php';

所以一般情况下,他是读取ThinkPHP/Mode目录下的common.php这个文件,该文件返回一个数组,其中便包含有core这个成员。

return array(

// 配置文件

'config' => array(...),

// 别名定义

'alias' => array(...),

// 函数和类文件

'core' => array(

THINK_PATH.'Common/functions.php',

COMMON_PATH.'Common/function.php',

CORE_PATH . 'Hook'.EXT,

CORE_PATH . 'App'.EXT,

CORE_PATH . 'Dispatcher'.EXT,

//CORE_PATH . 'Log'.EXT,

CORE_PATH . 'Route'.EXT,

CORE_PATH . 'Controller'.EXT,

CORE_PATH . 'View'.EXT,

BEHAVIOR_PATH . 'BuildLiteBehavior'.EXT,

BEHAVIOR_PATH . 'ParseTemplateBehavior'.EXT,

BEHAVIOR_PATH . 'ContentReplaceBehavior'.EXT,

),

// 行为扩展定义

'tags' => array(...),

);

但是在tp5.0,包括这些核心文件都使用了懒惰加载,也就是使用到了才加载进来。

主要策略是:

1、自动加载类先行

2、核心文件配置在一个文件中

加载类先行:由于核心文件也使用了懒惰加载,因此在框架运行起来之前,自动加载方法必须依据被注册好。因此可以看到在tp5中,自动加载方法单处成一个loader.php类。并且在base.php中可以看到,loader.php是第一个被加载进来的类方法。

核心文件配置:同tp3.2.3一样,tp5的核心文件也配置在一个文件中,不过现在不是通过应用模式了,而是直接定义在classmap.php中,该文件同样会返回一个包含核心文件的数组。

// 注册自动加载机制

public static function register($autoload = '')

{

// 注册系统自动加载

spl_autoload_register($autoload ?: 'think\\Loader::autoload');

// 注册命名空间定义

self::addNamespace([

'think' => LIB_PATH . 'think' . DS,

'behavior' => LIB_PATH . 'behavior' . DS,

'traits' => LIB_PATH . 'traits' . DS,

]);

// 加载类库映射文件

self::addClassMap(include THINK_PATH . 'classmap' . EXT);

...

}

addClassMap方法会把classmap.php返回的数组合并到self:$map中,方便autoload方法的查询使用。 当有一个类文件还没有包含进来的时候,Loader:autoload方法就会被调用:

// 自动加载

public static function autoload($class)

{

// 检测命名空间别名

if (!empty(self::$namespaceAlias)) {

$namespace = dirname($class);

if (isset(self::$namespaceAlias[$namespace])) {

$original = self::$namespaceAlias[$namespace] . '\\' . basename($class);

if (class_exists($original)) {

return class_alias($original, $class, false);

}

}

}

//这里使用了self::$map变量

if (!empty(self::$map[$class])) {

// 类库映射

include self::$map[$class];

} elseif (...) {

} else {

...

}

return true;

}

综上,tp5.0使用了懒惰加载,虽然单单在这一点上,系统的性能提升不明显(tp3.x性能实际上已经胜过其他框架),因为核心文件不管在tp3.2.3还是tp5中,大多数情况都需要全部包含进来的,晚包含和早包含都得包含的。但是胜在什么地方呢?

1、遵守规范(PSR-4)

2、代码更加简洁

1、遵循规范。限制了自由度,换来了规范化和工程化。对于底层架构,遵守规范还是比较好的。比如如果两个不同框架使用了不同的规范,那么我为他开发第三方库的时候,可能就需要读取两种不同的规范。但是如果他们都使用同一种规范的话,那么我了解这一种规范后,同样也可以用于另外一个框架,这就方便多了。对于规范,我觉得用到才查吧~~~

2、代码更加简洁

核心文件代码不需要额外代码实现,直接让自动加载方法加载便可。

php的惰性加载,thinkphp5.0的惰性加载相关推荐

  1. 一加android 6.0壁纸,一加手机2即将升级至Android 6.0:氧OS 3.0截图曝光

    [TechWeb报道]虽然旗下产品不多,但一加手机的口碑一向不错,特别是在海外拥有不少粉丝,甚至还悄然亮相了美剧<纸牌屋>第四季.3月15号,一加官网推出福利活动,买手机赠送定制后盖,多款 ...

  2. 一加桌面3.0 android8,一加手机XRemix6.0安卓8.1.0Beta2.0定制本地化增强适配归属农历等...

    制作者:moonlight-roms 基于版本:remix最新安卓8.1.0代码 适合机型:一加手机X双网版/全网通版/E1001/E1003等/onyx 注意事项: 1.开机后语言设置:Settin ...

  3. Mysql8秒级加字段_Mysql8.0秒级加字段

    Mysql 8.0版本合并了腾讯互娱数据库团队的Patch,可以实现秒级添加字段,这个功能可谓是mysql数据库攻城狮的福音,解决了之前5.6,5.7版本添加字段很高的运维成本. 下面是验证mysql ...

  4. thinkphp 框架自动加载原理_thinkPHP5.0框架自动加载机制分析

    本文实例讲述了thinkPHP5.0框架自动加载机制.分享给大家供大家参考,具体如下: 概述 ThinkPHP5.0 真正实现了按需加载,所有类库采用自动加载机制,并且支持类库映射和composer类 ...

  5. c# .netframwork 4.0 调用 2.0时报错 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。...

    "System.IO.FileLoadException"类型的未经处理的异常在 XXX.dll 中发生 其他信息: 混合模式程序集是针对"v2.0.50727" ...

  6. 【Android 安全】DEX 加密 ( 不同 Android 版本的 DEX 加载 | Android 8.0 版本 DEX 加载分析 | Android 5.0 版本 DEX 加载分析 )

    文章目录 一.不同版本的 DEX 加载 1.Android 8.0 版本 DEX 加载分析 2.Android 6.0 版本 DEX 加载分析 3.Android 5.0 版本 DEX 加载分析 一. ...

  7. C#连接Sqlite 出现:混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。的解决方案...

    C#连接Sqlite 出现: 混合模式程序集是针对"v2.0.50727"版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集.的解决方案 C#连接s ...

  8. 混合模式程序集是针对“v1.1.4322”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。

    看到一个kinect大牛编写的一个水果忍者的体感游戏版本,让我为自己一直以来只用现有的网页游戏来模拟kinect体感游戏控制感到惭愧,没办法,我还是菜鸟.学习一段后自己模仿星际大战这个游戏,自己写了一 ...

  9. .net4.0 使用低版本生成的dll, 混合模式程序集市针对V1.1.4322,无法在 4.0 运行时中加载该程序解决办法

    使用.net4.0开发DirectX,运行时报错:混合模式程序集市针对V1.1.4322,无法在 4.0 运行时中加载该程序 原因是DirectX是由.net1.1生成的,不能直接在.net4.0使用 ...

最新文章

  1. 脑出血遇到深度学习,是否可以无所遁形?
  2. 百度开源业内首个口罩人脸检测及分类模型,携手开发者共同抗疫
  3. Javascript模块化编程(一):模块的写法
  4. AOS V1.0 发布,JavaEE 应用基础平台
  5. 大数据分析之Hadoop
  6. 如何运行 SAP Spartacus cypress 端到端测试
  7. LeetCode 1184. 公交站间的距离
  8. 怎么查redis 中的 cache_20、springcloud如何使用spring-cache
  9. [ZJOI2008]泡泡堂
  10. 实战java虚拟机配套代码
  11. 【嵌入式模块】再探ESP8266,保姆级教程
  12. 微信小程序开发的基本流程__BaiMoci
  13. 2022年数学建模国赛(A题/B题/C题)评阅要点
  14. 【base】串行口RS232的接口定义
  15. 【Three.js】十二、three.js摄像机控件
  16. IT前沿技术之node.js篇七:Node.js与HBase
  17. 关于Python中的编程,这篇阅读量预算10万+的文章可能是你见过的最完整的讲解
  18. 单片机移频防啸叫_JDS M-9108全自动高速移频反馈抑制器 会议鹅颈话筒麦克风防啸叫...
  19. •SVG g、defs、symbol和use元素详解
  20. PTA (特立独行的幸福)

热门文章

  1. android触屏对焦,Android相机对焦模式
  2. PKU2506Tiling
  3. 《当程序员的那些狗日日子》一
  4. 语雀可以导出html吗,工具 - Confluence 迁移到语雀 - 《语雀使用文档》 - 书栈网 · BookStack...
  5. pysaprk数据倾斜怎么解决?
  6. 网易上线短视频创作平台“网易知识公路“
  7. SONET/SDH帧格式
  8. 跟益达学Solr5之使用Ansj分词器
  9. Java基础知识(五) 字符串与数组
  10. Debian权威发音