灰太狼 2017-05-20 11:15:02 2794次浏览 1条回复 1 5 0

都说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组件里肯定存在了。所以就会加载这个组件了。而其他不用的组件不会加载进来。

降龙十八掌打完收工!

觉得很赞
您需要登录后才可以回复。登录 | 立即注册