Yii设计分析-CWebApplication文件

CWebApplication文件

CWebApplication类是专门处理用户请求的类,这里说的请求是只整个请求周期的控制处理。在入口程序中唯一创建了他也就足为奇了。他是由YiiBase帮助类创建的。这里有个疑惑就为什么要用帮助类来创建,而不是直接在入口脚本中直接实例化。实际上我们知道YiiBase.php不但定义了一个帮助类,而且启动php的autoload机制。所以才可以这样简单的直接的实例化了。现在,我把它想象成一个大容器。

在入口文件中通过帮助类我们创建了CWebApplication实例,那么这个web应用类到底是什么呢。先来看看CWebApplication类的继承关系。

CWebApplication类的继承关系
CWebApplication -> CApplication -> CModule -> CComponent

从右往左看,CComponent是根类,Yii框架是基于组件设计的,所以这样是顺理成章的。CModule是以根类为基础的管理应用组件和模块的。CApplication类是所有应用类的基类。CWebApplication就是一个web应用类,它具备所有web应用的特点了。下面具体说下各个类的作用。

CComponent类
CComponent类为子类提供了基于属性(property)、事件(event)、行为(behavior)编程接口。

在面向对象的程序设计中,身为基类就一定要够抽象。也就是能包容整体的程序编码思想。Yii的CComponent类做到了这一点。它就定义了一个管理属性和事件的协议。
对于属性,Yii全部使用__get和__set管理。通过定义这个魔术方法,同所有子类中定义的对应属性的getXXX和setXXX方法建立起了联系。这里不是用其他面向对象语言的访问方法($a=$component->getText();),而是更加直接的$a=$component->text; 方式访问。这显示很有PHP面向对象特色。

示例:
$a=$component->text; // equivalent to $a=$component->getText();
$component->text='abc'; // equivalent to $component->setText('abc');

示例
// getter, defines a readable property 'text'
public function getText() { ... }
// setter, defines a writable property 'text' with $value to be set to the property
public function setText($value) { ... }

对于事件要从四块来说,1定义事件:Yii要求事件名以on开头。2事件处理器可以是一个函数也可以是一个类方法function eventHandler($event) { ... }3事件绑定$component->onClick=$callback; // or $component->onClick->add($callback); 4事件被触发, $this->raiseEvent('onClick',$event);之后事件处理器将被自动调用。即某个函数被绑定成事件的回调函数将被自动处理。

组件的行为是一种不通过继承而扩展组件功能的方法(参见设计模式里的策略模式)。
行为类必须实现 IBehavior 接口,大多数行为可以从 CBehavior 基类扩展而来。

IBehavior接口提供了4个方法。
attach($component)将自身关联到组件,detach($component) 解除$component关联,getEnabled()和setEnabled()设置行为对象的有效性。

行为对象存放在组件的$_m[]数组里,数组键值为行为名字符串,数组值为行为类对象。

组件通过attachBehavior ($name,$behavior)来扩展一个行为:
$component-> attachBehavior (‘render’,$htmlRender)
为$component添加了一个名字为render的行为,$htmlRender 需是一个实现 IBehavior 接口的对象,或是一个数组:
array( 'class'=>'path.to.BehaviorClass',
'property1'=>'value1',
'property2'=>'value2',
* )
会根据数组的class来创建行为对象并设置属性值。

$htmlRender被存储到$_m[‘render’]中。

外部调用一个组件未定义的方法时,魔术方法__call() 会遍历所有行为对象,如果找到同名方法就调用之。

例如 $htmlRender 有个方法 renderFromFile(),则可以直接当做组件的方法来访问:

$component-> renderFromFile ()

CApplication::__construct
把应用实例通过Yii::setApplication($this);保存的帮助类的静态属性里。这个目的是方便在成个处理过程中引用到。

设置类CApplication::basePath, 文档说越早设置麻烦越少。

定义了三个路径别名,路径别名算现在框架中比不可少的。有点和php6的命名空间作用相似。

$this->preinit();是执行一些前初始化工作,这个方法定义在CModule类中,是一个空方法,要求子类实现。不过web应用类并没有做重写。但是可以看到CModule作为应用组件的管理者,还做了不少事情的。CApplication在复写上级方法时没有完全废除领导的作为。

$this->initSystemHandlers();初始化系统处理器。主要是对set_exception_handler和set_error_handler进行定义。这些函数都定义在了CApplication类中,这也反映两者是和应用紧密相关的。这块也比较能反映Yii的设计思路。之后再详细分析两个方法。

$this->registerCoreComponents(); 注册核心应用组件。注册了几个系统组件(Components)。
Components 是在 CModule 里定义和管理的,主要包括两个数组

private $_components=array();
private $_componentConfig=array();

CWebApplication 对象注册了以下几个Component:urlManager, request,session,assetManager,user,themeManager,authManager,clientScript。CWebApplication的parent 注册了以下几个Component:coreMessages,db,messages,errorHandler,securityManager,statePersister。

先保存核心类的配置,实例化之后就只保存实例了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值