关闭

Yii源码之import小析

标签: 源码yiiphp
400人阅读 评论(0) 收藏 举报
分类:

用过Yii框架的人,一般都知道在Yii的配置里面,有个import参数。这个参数一般可以这样配置:

Yii::setPathOfAlias('docroot', '/data/php/classes');
$config = array(
    ....
    'import' => array(
        'docroot.services.*',
        'docroot.models.*',
    ),
    ...
);

这样配置之后,当有些写好的类放在’/data/php/classes/services/’目录下面,或者放在’/data/php/classes/models’目录下面时,我们也可以在代码中直接使用,不论我们的项目放在哪里。那这是为什么呢?

假设我们现在写的是web应用。那么代码的流程大致如下:
①、Yii::createWebApplication($config)->run();
②、CApplication的构造方法。代码如下:

public function __construct($config=null){
    Yii::setApplication($this);
    // set basePath at early as possible to avoid trouble
    if(is_string($config))
        $config=require($config);
    if(isset($config['basePath'])){
        $this->setBasePath($config['basePath']);
        unset($config['basePath']);
    }
    else
        $this->setBasePath('protected');
    Yii::setPathOfAlias('application',$this->getBasePath());
    Yii::setPathOfAlias('webroot',dirname($_SERVER['SCRIPT_FILENAME']));
    Yii::setPathOfAlias('ext',$this->getBasePath().DIRECTORY_SEPARATOR.'extensions');

    $this->preinit();

    $this->initSystemHandlers();
    $this->registerCoreComponents();//加载核心组件

    $this->configure($config);//加载配置内容
    $this->attachBehaviors($this->behaviors);
    $this->preloadComponents();

    $this->init();
}

③、…..

后续的流程就不讲了,这里就讲一下在CApplication构造方法里面调用的configure方法。这个方法在其父类CModule里面实现。

public function configure($config){
    if(is_array($config)){
        foreach($config as $key=>$value)
            $this->$key=$value;//这里注意了,这里会先调用这个类的魔术方法__set();
    }
}

这段代码很简单,就是遍历config数组,然后调用其魔术方法:

public function __set($name,$value){
    $setter='set'.$name;
    if(method_exists($this,$setter))
        return $this->$setter($value);
    ......
}

在魔术方法里面,会先寻找该类是否存在名为$setter的方法。比如当遍历config,遍历到import时,就会寻找该类中,是否存在名为setimport的成员函数,由于php函数名不区分大小写,所以,发现存在setImport函数,这个函数在CModule中实现。代码如下:

public function setImport($aliases){
    foreach($aliases as $alias)//这里的$alias就是$config['import']
        Yii::import($alias);
}

很简单,就是遍历$config[‘import’],然后调用Yii::import()函数。这个函数就在yii.php里面实现。这个函数主要是做什么事情呢?比如当遍历到
$config[‘import’]的第一个元素,然后将’docroot.services.‘这个值传给import函数。这个函数前面会做几个判断处理,这里我们不用管,一般用不着。然后,它会l调用Yii::getPathOfAlias()这个函数,将’docroot.services.‘转为正确的路径’/data/php/classes/services/*’,最后调用set_include_path()这个方法,将路径设到php的include_path中。这之后,假设在’/data/php/classes/services/’目录下有个’SayHelloService.php’类,当代码中需要的时候,只需要

include('SayHelloService.php');
$sayHello = new SayHelloService();

即可,而不需要给出SayHelloService.php的路径。

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

LuLuCMS基于Yii2.0开发的一个内容管理系统(CMS)

直接上图片吧 过几个弄个在线的Demo
  • yiifans
  • yiifans
  • 2014-07-18 10:40
  • 3103

yii2框架-yii2的asset资源包(十一)

一、资源包定义 Yii2对于CSS/JS 管理,使用AssetBundle资源包类。 在basic/assets下创建如下: app/assets/AppAsset.php 代码: <?php /...
  • u012979009
  • u012979009
  • 2016-06-12 15:35
  • 1663

yii中 集成PHPExcel 实现excel导入

下载PHPExcel 将其解压至extensions目录中 在这个地址下载PHPexcel    http://phpexcel.codeplex.com/releases/view/96183 下载...
  • uuus007
  • uuus007
  • 2014-02-21 16:29
  • 1542

spring源码附录(8)import、beans标签的解析

对于过于庞大的项目,分模块应该是解决麻烦的好方法了。spring import标签就可以达到此目的,例如: 下面来看源码中的解析: protected void import...
  • disiwei1012
  • disiwei1012
  • 2017-04-25 21:57
  • 461

基于ubuntu16.04系统下OpenCV源码安装及无法import cv2

开篇OpenCV: Open Source Computer Vision Library 官网:http://opencv.org/ github:https://github.com/...
  • tengxing007
  • tengxing007
  • 2017-01-12 18:51
  • 6187

Windows 上 Assimp(Open Asset Import Library) 源码的编译 及 Samples 的编译运行

Assimp  为加载多种已知 3D 模型格式提供了一套统一的方式,而且它还是开源跨平台的(Android/iOS 也都有支持)。 可能会遇到的错误及解决方法: 1. error LNK2019:...
  • panda1234lee
  • panda1234lee
  • 2016-10-26 01:03
  • 2329

Python 的 import 机制 《Python源码剖析》笔记

在Python中,是通过import来导入模块和包,那么,import的机制是什么呢? 其实,在启动python环境时,python就会自动的导入许多的模块,这些模块被加载到了内存中,然而,为了保证当...
  • u013307828
  • u013307828
  • 2013-12-28 21:23
  • 226

Sqoop源码分析(四) Sqoop中通过hadoop mapreduce从关系型数据库import数据分析

Sqoop源码分析(四) Sqoop中通过hadoop mapreduce从关系型数据库import数据分析 博客分类:  Hadoop Sqoop         本博...
  • flyeagle88
  • flyeagle88
  • 2013-03-26 16:35
  • 646

spring 3源码解析之如何解析"import", "alias", "bean"标签

解析的步骤:  1、加载web.xml、加载监听器  org.springframework.web.context.ContextLoaderListener  2、ContextLoader...
  • z69183787
  • z69183787
  • 2016-12-02 10:26
  • 442

spring源码分析之@ImportSelector、@Import、ImportResource工作原理分析

1. @importSelector定义: /** * Interface to be implemented by types that determine which @{@link ...
  • tiger0709
  • tiger0709
  • 2017-08-07 14:55
  • 117
    个人资料
    • 访问:49773次
    • 积分:822
    • 等级:
    • 排名:千里之外
    • 原创:32篇
    • 转载:5篇
    • 译文:1篇
    • 评论:0条
    文章分类
    最新评论