Yii框架分析(六)——Yii的别名管理与对象创建管理

YiiBase类为YII框架的运行提供了公共的基础功能:别名管理与对象创建管理。

在创建一个php的对象时,需要先include这个类的定义文件,然后再new这个对象。在不同环境下(开发环境/测试环境/线上环境),apache的webroot路径的配置可能不一样,所以这个类的定义文件的全路径就会不同,Yii框架通过YiiBase的别名管理来解决了这个问题。

在创建对象时,需要导入对应类的定义,经常需要使用这5个函数:include()、include_once()、require()、require_once()、set_include_path()。Yii通过使用YiiBase::import()来统一解决这个问题。下图描述了YiiBase提供“别名管理与对象创建管理”的工作原理:

首先看别名管理,它是通过为某个文件夹(一个文件夹往往对应一个模块)起一个别名,在Yii框架中可以使用这个别名来替代这个文件夹的全路径,比如:system别名代表的是框架/home/work/yii/framework的路径,所以可以使用system.base.CApplication代表/home/work/yii/framework/base/CApplication.php文件的路径。当然在应用层的代码中也可以通过Yii::setPathOfAlias来注册别名。

一般情况下我们使用绝对路径或者相对路径来进行文件引用,当然这两种情况都有弊端。绝对路径:当我们的代码部署到测试环境或者线上环境的时候需要大量修改被include文件的路径;相对路径:当某些模块的文件夹的位置发生调整(改名)的时候,所有的相对路径都需要修改。而使用别名的方式只需要改一处:注册别名的时候,即Yii::setPathOfAlias()。从而将文件夹的变动而导致的代码改动集中到一处完成。

再看import功能:a、导入一个类的定义,从而可以创建该类的对象;b、将某个文件夹加入到include_path,从而可以直接include这个文件下的所有文件。Yii::import相当于如下5个函数的统一:include()、include_once()、require()、require_once()、set_include_path()。而且一般情况下速度会比这些函数更快。当然Yii::import支持别名的功能,从而可以解决路径变动带来的麻烦。

最后看一下对象的创建,在YII框架中有2中方法创建对象:1、使用new关键字;2、使用Yii::createComponent方法。

当使用new关键字创建对象时,autoload会分3步来寻找对应类的定义:a、判断是否为framework中的类(framework的所有类和这个类的全路径都保存在YiiBase的一个成员变量中);2、判断是否使用Yii::import导入了这个类,对于非框架的类,我们在创建这个类的对象时需要先import这个类的定义;3、从include_path目录下查找以这个类名字命名的php脚本,所以在开发的时候类名尽量与文件名保存一致,这样我们导入包含这个文件的文件夹就行了,从而无需把这个文件夹中的每个文件都导入一次。

当使用Yii::createComponent方法创建对象时,它提供了比new关键字更多的功能:a、通过这个类的全路径别名来指定类的位置和类名(类名必须与文件名一致),当这个类还没有导入的时候,会根据全路径来自动导入这个类的定义;2、对创建出来的对象的成员变量进行赋值。即如下图描述,原来要写3行以上的代码,现在一行代码就可以搞定(write less, do more)。

时间: 2024-11-17 13:04:02

Yii框架分析(六)——Yii的别名管理与对象创建管理的相关文章

YII框架分析笔记2:组件和事件行为管理

Yii是一个基于组件.用于开发大型 Web 应用的高性能 PHP 框架.CComponent几乎是所有类的基类,它控制着组件与事件的管理,其方法与属性如下,私有变量$_e数据存放事件(evnet,有些地方叫 hook),$_m数组存放行为(behavior). 组件管理 YII是一个纯oop框架,很多类中的成员变量的受保护或者私有的,CComponent中利用php中的魔术方法__get(),__set()来访问和设置属性,但这些方法的作用远不指这些.下面用__get()来说明 [php] vi

Yii框架分析(五)——再谈CComponent基础类

这篇文章可作为<Yii框架分析(二)——CComponent类剖析>的补充. CComponent类为YII框架的基于组件和事件驱动编程提供了基础,YII框架中的大部分类都将CComponent类作为基类.CComponent类为它的子类提供3个特性: 1.成员变量扩展通过定义两个成员函数(getXXX/setXXX)来定义一个成员变量,比如:public function getText() {…}public function setText {…}这样就相当于定义了一个$text成员变量

Yii框架分析(三)——类加载机制及应用组件的管理、配置、访问、创建

Yii应用的入口脚本引用出了Yii类,Yii类的定义: class Yii extends YiiBase { } 由yiic创建的应用里Yii类只是YiiBase类的“马甲”,我们也可以根据需求定制自己的Yii类. Yii(即YiiBase)是一个“helper class”,为整个应用提供静态和全局访问入口. Yii类的几个静态成员:$_aliases : 存放系统的别名对应的真实路径$_imports :$_classes :$_includePaths php include paths

YII框架分析笔记10:日志

yii框架中日志组件记录的等级5类,在CLogger已通过常量定义: const LEVEL_TRACE='trace'; const LEVEL_WARNING='warning'; const LEVEL_ERROR='error'; const LEVEL_INFO='info'; const LEVEL_PROFILE='profile'; CLogger为所有日志写入和获取提供接口,通过日志路由管理类CLogRouter将日志分发到不同日志展现或存储介质中. 日志组件配置 [php]

YII框架分析笔记6:视图

YII框架使用的view是在原生的php模板上进行扩展的.CController中对视图的渲染有多种方法: render($view,$data=null,$return=false)//连同layout一起渲染 renderPartial($view,$data=null,$return=false,$processOutput=false)//不渲染layout renderText($text,$return=false)//渲染静态内容和layout renderDynamic($cal

YII框架分析笔记1:YII执行流程

yii整体执行流程直观,具体由以下步骤: 1.程序入口文件index.php加载yii框架引导程序(bootstrap)文件yii.php,加载配置文件以及其他自定义配置. 2.yii.php中Yii类继承了YiiBase,主要封装框架的一些通用方法,比如自动加载.创建组件.核心类路径映射.记录日志以及调试等,YiiBase.php中注册自动加载方法.另外Yii类预留可以自定义一些方法作为扩展. 3.回到index.php,Yii::createWebApplication($config),创

YII框架分析笔记8:CDataProvider

CDataProvider,顾名思义,数据提供者,它提供了三个抽象方法(fetchData,.fetchKeys 和 calculateTotalItemCount),分别为调用不同数据结构的数据提供了获取数据.获取键值.获取数量的,接口,在YII框架 中,CActiveDataProvider.CArrayDataProvider.CSqlDataProvider是它的子类,除了提供数据之外, 他还提供分页和排序功能.下面以获取数据fetchData()为例 CActiveDataProvid

YII框架分析笔记5:控制器和动作

CBaseController是控制器和挂件的基类,主要提供了视图渲染,挂件,剪辑.片段缓存等方法,CController是所有应用中自定义控制器的基类. 创建动作 [php] view plaincopy public function run($actionID) { if(($action=$this->createAction($actionID))!==null) { if(($parent=$this->getModule())===null) $parent=Yii::app()

YII框架分析笔记3:表单模型和验证

表单模型CFormModel绝大部分继承CModelCModel,由于表模型数据不需要持久化,所以主要在验证操作上.下面以框架脚手架生成的网站登录为例说明表单模型. [php] view plaincopy //模型中的验证规则 public function rules() { return array( array('username, password', 'required'), array('rememberMe', 'boolean'), array('password', 'aut