知识储备--记录yii核心技术,类的延迟加载(lazy loading) [ 新手入门 ]
都说Yii速度快,快是快,单是为什么快呢?
因为yii用了一个技术叫做类的延迟加载,这个东西被YII玩的惟妙惟肖。
function auto_loader($class){
require('class\\'.$class.'.php');
}
spl_autoload_register('auto_loader');
//
switch($level){
case '1':
$class1 = new Class1;
break;
case '2':
$class1 = new Class2;
break;
case '3':
$class1 = new Class3;
break;
case '4':
$class1 = new Class4;
break;
case '5':
$class1 = new Class5;
break;
}
能够更快的找到类所在位置,并快速加载它怎么做到呢? 这里就引出了 “类的映射表机制”
两行代码搞定
\Yii::$classMap['app\models\Order'] = 'D:\www\basic\models\Class1.php'; $class1 = new Class1;
Yii 延迟加载组件:
Yii就是个组件化的框架,里面提供着各式各样的组件,例如 session、response,request,db...
这些组件我们在使用Yii的时候经常看到。 例如在控制器里这样使用:
class testController extends Controller{
public function actionIndex(){
$session = \Yii::$app->session;
}
}
都知道是这样用,但是Yii内部是怎么处理这个session组件的呢?
Yii的入口文件是 index.php。看过这个文件的都知道里面会new一个$app实例对象。
而常规的方式是$app对象应该去把所有组件都加载进来,然后后面的其他控制器里可以随便使用了。 但是这样的方式很消耗性能。有用的没用的都加载进来了。
Yii处理的方式是 “充分的利用了PHP 的get”。 PHP有个机制是对象在获取某个属性不存在的时候会去调用get();---看到这句是不是懂了什么了?
就是这样,Yii加载组件就是利用PHP这个机制,在new $app的时候不加载任何组件
在控制器里当使用session组件是 是这样的 \Yii::$app->session 。 Yii做的事情是 检查 $app->session 是否有这个属性?肯定没有了,但是不会报错,因为PHP有个属性不存在会去get()的机制,秘密就在这里了。属性没找到就会去执行get();而自信看session组件它重写了__get().在里面拼接了get开头的方法名(这也是为什么看到很多YII定义的函数都是get开头的原因)。最后YII会判断是否存在getSession这个方法,这个方法在session组件里肯定存在了。所以就会加载这个组件了。而其他不用的组件不会加载进来。
降龙十八掌打完收工!
灰太狼
最后登录:2023-07-14
在线时长:76小时17分
- 粉丝28
- 金钱3290
- 威望150
- 积分5550