Yii-import-导入-自加载

来源:互联网 发布:java邮件设置传输协议 编辑:程序博客网 时间:2024/06/13 03:19

用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文件夹,它被翻译成文件系统路径。下表显示了更多的标准的别名:


AliasPathapplicationpath_to_webroot/protectedsystempath_to_webroot/frameworkziipath_to_webroot/framework/ziiwebrootpath_to_webrootextpath_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',    ),

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

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

                                             ________________________________________

0 0