Yii-import-导入-自加载

用PHP变成最恼人的事情是用include和require加载额外的代码。幸运的是你可以用SPL类加载器自动完成。

Yii紧紧依靠的就是自加载,当我们使用一个类,譬如,CDbCriteria,我们没有明确的包含它,所以PHP起初不能找到它,PHP试着依靠自加载特性。准确来说,就是SPL自加载器。在大部分情况下,Yii默认的加载器(YiiBase::autoload)将被用到。

为了速度和简单,几乎所有的核心框架类都是在必要的时候被加载的,而没有明确的包含或导入它们。它是通过YiiBase::$_coreClasses完成的,所以加载核心类是非常迅速的。Zii类像CMenu,扩展类或者你自己写的类都不是自动加载的,因此我们需要先导入它们。

使用Yii::import导入类是相当的明智:

  • 默认的,导入不是立即包含一个类。
  • 没被使用的类不会被包含。
  • 它不会再三的加载一个类,因此你可以放心的导入同一个类很多次。

怎么做…
  1. 假设我们有一个自定义的类LyricsFinder,它负责为给定歌曲找到歌词。我们已经将它放在protected/apis/lyrics/目录下了,在我们的TestController 中,我们打算这样用:

class TestController extends CController
{
    public function actionIndex($song)
    {
        $lyric = 'Nothing was found.';
        $finder = new LyricsFinder();
        
        if(!empty($song))
            $lyric = $finder->getText($song);
        
        echo $lyric;
    }
}

2.当我们执行它时,它报出了一个PHP错误,因为Yii找不到我们的类。我们来修改下代码:


class TestController extends CController
{
    public function actionIndex($song)
    {
        $lyric = 'Nothing was found.';
        
        // 导入一个类
        <span style="color:#FF0000;">Yii::import('application.apis.lyrics.LyricsFinder');</span>
        
        $finder = new LyricsFinder();
        
        if(!empty($song))
            $lyric = $finder->getText($song);
        
        echo $lyric;
    }
}

3.现在我们的代码就能正常工作了。


————————————————注:内置的Yii类加载器需要每个类放置在单独的文件中,这些文件和类名称一样。————————————————————————————————————————


我们再来看看上面的application.apis.lyrics.LyricsFinder是怎么工作的。

application是一个标准别名,指向你应用程序的protected文件夹,它被翻译成文件系统路径。下表显示了更多的标准的别名:


AliasPath
applicationpath_to_webroot/protected
systempath_to_webroot/framework
ziipath_to_webroot/framework/zii
webrootpath_to_webroot
extpath_to_webroot/protected/extensions


————————————————注:你可以用Yii::setPathOfAlias方法自己定义你的小应用程序。————————————————————————————————————————————————


apis.lyrics 被转义成apis/lyrics 并且被附加到从application中获取的路径;LyricsFinder是我们想要导入的类名。

我们可以使用Yii::import(‘application.apis.lyrics.*’)来导入整个目录。 注意* 并不包含子文件夹,因此如果你需要lyrics/includes, 你应该添加另外一条导入语句Yii::import(‘application.apis.lyrics.includes.*).

为了性能,当你使用一个单独的类时,使用明确的路径而不是*比较好。


延伸…

             如果你想你的类像Yii核心类那样自动被导入,你可以在配置文件main.php中配置全局导入:


return array(
    // ...
    
    // global imports
    'import'=>array(
        'application.models.*',
        'application.components.*',
        'application.apis.lyrics.*',
        'application.apis.lyrics.includes.*',
        'application.apis.albums.AlbumFinder',
    ),

——————注意,跟使用*一样,使用大量的全局导入会减慢你的应用执行速度的。——————————

                                                                                                   ————————————————————————————————————————

                                             ________________________________________

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值