摘要:据官方介绍,框架广泛的使用了一种叫做延迟加载的技术,从而达到这样的效果。比如我们在判断中,需要实例化类的时候,再去加载相应的文件。代码如下等于不等于优化过后的文件效率肯定得到了提升,这个也就是类的延迟加载雏形。这就是的延迟加载了。
Yii框架号称最高效的PHP框架,执行效率高出其他框架很多。据官方介绍,Yii框架广泛的使用了一种叫做延迟加载的技术,从而达到这样的效果。
下面我们就通过实例详细的来介绍一下这个技术
类的延迟加载首先我们在www目录新建2个类Class1、Class2和一个index.php文件。
在Class1和Class2中我们只简单的写一个简单结构
Class1.php class Class1{ public function __construct(){ echo "class1"; } } Class2.php class Class2{ public function __construct(){ echo "class2"; } }
接下来我们在index.php文件中引入这两个类
require_once("Class1.php"); require_once("Class2.php");
同时我们再定义一个变量$state,将其值设置为1。我们再对$state做一些判断操作。
$state = 1; if($state == 1) { echo "state 等于 1"; $class1 = new Class1(); } else { echo "state 不等于 1"; $class2 = new Class2(); }
我们判断$state值,如果为1,则输出一句话和实例化Class1。否则,同样输出一句话,和实例化Class2。
代码正常运行。但是我们发现,我们在if中实例化Class1或Class2。不管何时,都只能实例化其中的一个,而我们在引入文件的时候,却是一次性的将两个类都引入进来了。这样不可避免的造成了一些资源的浪费。
所以,我们可以先进行一些小的优化。
比如:我们在if判断中,需要实例化类的时候,再去加载相应的文件。代码如下:
$state = 1; if($state == 1) { echo "state 等于 1"; require_once("Class1.php"); $class1 = new Class1(); } else { echo "state 不等于 1"; require_once("Class2.php"); $class2 = new Class2(); }
优化过后的index.php文件效率肯定得到了提升,这个也就是类的延迟加载雏形。但是这样就会出现一个问题,在需要加载的文件很多时候,并不是太方便。通用性不是很强。
在Yii中,这个问题被很好的解决。
其核心武器就是spl_autoload_register()函数,该函数可以自动执行函数。
其括号中参数为需要执行的函数的函数名。比如我们定义一个函数,叫fun_loader().然后将fun_loader作为spl_autoload_register()的参数,那么在程序运行时候,就会自动的执行fun_loader函数。
我们先在index.php函数顶部加入代码
function fun_loader($value) { echo "123"; } spl_autoload_register("fun_loader");
这样程序在运行时候就会自动调用函数fun_loader,并且输出123
有了自动调用函数功能,我们就可以把刚刚的需要加载的两个类放入这个函数,达到自动加载的效果。
function fun_loader($value) { require_once("Class1.php"); require_once("Class2.php"); }
但是这样还是回归到了之前的情况,多加载了一个无用的类。
所以,fun_loader的参数起作用了,我们可以动态的将需要加载的类传递进来,实现按需加载。
我们将改造后的index.php完整的写出来,如下:
function fun_loader($value) { require_once($value.".php"); } spl_autoload_register("fun_loader"); $state = 1; if($state == 1) { echo "state 等于 1"; $class1 = new Class1(); } else { echo "state 不等于 1"; $class2 = new Class2(); }
这样,当实例化的时候,如果发现没有找到相应的类。那么就会执行一下fun_loader函数。同时,将实例化的类名作为参数,传递给fun_loader
这样就可以实现需要时候加载需要的类。这就是Yii的延迟加载了。
Yii具体的代码在文件vendoryiisoftyii2Yii.php
* @since 2.0 */ class Yii extends yiiBaseYii { } spl_autoload_register(["Yii", "autoload"], true, true); Yii::$classMap = require(__DIR__ . "/classes.php"); Yii::$container = new yiidiContainer();
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/30423.html
摘要:本文讨论通过工具安装框架并优化过程中遇到的问题,约定读者对基本原理有一定了解,并且有安装框架的实际经验。这个命令是优化包的关键一环。命令要谨慎使用。 本文讨论通过composer工具安装Yii2框架并优化Vendor过程中遇到的问题,约定读者对composer基本原理有一定了解,并且有安装Yii2框架的实际经验。 在Yii2社区里经常会遇到一类问题,那就是 安装完官方推荐的版本后1 ...
摘要:运行来安装指定的扩展。这更便于用户辨别是否是的扩展。当用户运行安装一个扩展时,文件会被自动更新使之包含新扩展的信息。上述代码表明该扩展依赖于包。例如,上述的条目声明将对应于别名。为达到这个目的,你应当在公开发布前做测试。 简述 扩展是专门设计的在 Yii 应用中随时可拿来使用的, 并可重发布的软件包。 基础 例如, yiisoft/yii2-debug 扩展在你的应用的每个页面底部添加...
摘要:我的目标是使本系列成为关于应用程序性能的完整指南。代码分割就是将应用程序分割成这些延迟加载的块。总结延迟加载是提高应用程序性能并减少其大小的最佳方法之一。在本系列的下一部分中,我将向您展示如何使用和路由来分割应用程序代码。 当移动优先(mobile-first)的方式逐渐成为一种标准,而不确定的网络环境因素应该始终是我们考虑的一点,因此保持让应用程序快速加载变得越来越困难。在本系列文章...
摘要:如果需要防范这种攻击,请修改构造函数,使其在被要求创建第二个实例时抛出异常。单例模式与单一职责原则有冲突。源码地址参考文献设计模式之禅 定义 单例模式是一个比较简单的模式,其定义如下: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 或者 Ensure a class has only one instance, and provide a global point of ac...
阅读 2807·2021-11-25 09:43
阅读 959·2021-10-11 10:57
阅读 2462·2020-12-03 17:20
阅读 3695·2019-08-30 14:05
阅读 2391·2019-08-29 14:00
阅读 1976·2019-08-29 12:37
阅读 1637·2019-08-26 11:34
阅读 3181·2019-08-26 10:27