Yii框架核心组件类实例详解


Posted in PHP onAugust 06, 2019

本文实例讲述了Yii框架核心组件类。分享给大家供大家参考,具体如下:

CComponent类为YII框架的基于组件和事件驱动编程提供了基础,YII框架中的大部分类都将CComponent类作为基类。

CComponent类为它的子类提供3个特性:

1、成员变量扩展

通过定义两个成员函数(getXXX/setXXX)来定义一个成员变量,比如:

public function getText() {…}
public function setText {…}

这样就相当于定义了一个$text成员变量,可以这样调用

$a=new CComponent;
$a=$component->text; // 等价于$a=$component->getText();
$component->text='abc'; // 等价于$component->setText(‘abc');

CComponent是通过魔术方法__get和__set来实现“成员变量扩展”特性的,如果对类本身不存在的成员变量进行操作时,php会调用这个类 的__get和__set方法来进行处理。CComponent利用这两个魔术方法实现了“成员变量扩展”特性。下图描述了一个CComponent的子 类,它增加了active和sessionName两个成员变量,该图描述了对于这两个成员变量的调用流程。

Yii框架核心组件类实例详解

面向对象编程中直接定义一个成员变量就可以了,为什么CComponent要通过定义2个函数来实现一个成员变量呢?一个主要得原因是需要对成员变 量进行“延时加载”,一般情况下类的成员变量是在构造函数或者初始化函数进行统一赋值,但是在一次web请求的处理过程中不是每个成员变量都会被使用,比 如App类中定义了两个成员变量:$cache和$db($cache是一个缓存对象,$db是一个数据库链接对象),这两个对象在App类初始化的时候 创建,但是一个web网站的有些页面,它内容可以通过缓存获取,那么数据库链接对象其实就不需要创建。如果将App定义为CComponent的子类,在 App类中定义两个方法:getCache/getDb,这样就可以做到第一次使用db成员变量的时候,才调用getDb函数来进行数据库链接的初始化, 从而实现延时加载——即在第一次使用时进行初始化。虽然延时加载会增加一次函数调用,但是可以减少不必要的成员变量的初始化(总体上其实是提升了网站的访 问速度),而且可以使得我们的代码更加易维护、易扩展。

延时加载应该是“成员变量扩展”特性的最重要的用途,当然这个特性还会有其它用途,想一想,当你操作一个成员变量的时候,你其实是在调用getXXX和setXXX成员函数,你是在调用一段代码!

2、事件模型

事件模型就是设计模式中的“观察者模式”:当对象的状态发生了变化,那么这个对象可以将该事件通知其它对象。

为了使用事件模型,需要实现这三个步骤:1、定义事件;2、注册事件句柄;3、触发事件。
CComponent的子类通过定义一个以on打头的成员函数来定义一个事件,比如:public function onClick(){…},接着通过调用attachEventHandler成员函数来注册事件句柄(可以注册多个事件句柄),最后通过调用 raiseEvent来触发事件。

CComponent类使用一个私有的成员变量来保存事件以及处理该事件的所有句柄,该成员变量可以看作一个hash表,hash表的key是事件的名称,hash表的value是事件处理函数链表。

Yii框架核心组件类实例详解

3、行为类绑定

有两种办法可以对类添加特性:1、直接修改这个类的代码,添加一些成员函数和成员变量;2、派生,通过子类来扩展。很明显第二种方法更加易维护、易扩展。如果需要对一个类添加多个特性(多人在不同时期),那么需要进行多级派生,这显然加大了维护成本。

CComponent使用一种特殊的方式对类信息扩展——行为类绑定。行为类是一个CBehavior的子类,CComponent可以将一个或者多个 CBehavior类的成员函数和成员变量添加到自己身上,并且在不需要的时候卸载掉某些CBehavior类。下面是一个简单的例子:

//计算器类
class Calculator extends CBehavior
{
public function add($x, $y) { return $x + $y; }
public function sub($x, $y) { return $x ? $y; }
…
}
$comp = new CComponent();
//为我的类添加计算器功能
$comp->attachbehavior(‘calculator', new Calculator());
$comp->add(2, 5);
$comp->sub(2, 5);

CComponent通过__get、__set和__call这3个魔术方法来实现“行为类绑定”这个特性,当调用CComponent类不存在的成员 变量和成员方法的时候,CComponent类会通过这三个魔法方法在“动态绑定的行为对象”上进行查找。即将不存在的成员变量和成员方法路由到“动态绑 定对象”上。

Yii框架核心组件类实例详解

可以用3句话来总结CComponent类的特性:

1、 更好的配置一个对象,当设置对象的成员变量的时候,其实是运行一段代码;
2、 更好的监听一个对象,当对象的内部状态发生变化的时候,其它对象可以得到通知;
3、 更好的扩展一个对象,可以给一个对象增加成员变量和成员函数,还能监听这个对象的状态。

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

PHP 相关文章推荐
谈谈PHP的输入输出流
Feb 14 PHP
PHP+MySQL 制作简单的留言本
Nov 02 PHP
PHP导入Excel到MySQL的方法
Apr 23 PHP
php用header函数实现301跳转代码实例
Nov 25 PHP
php顺序查找和二分查找示例
Mar 27 PHP
ThinkPHP应用模式扩展详解
Jul 16 PHP
php实现文件下载代码分享
Aug 19 PHP
PHP闭包函数详解
Feb 13 PHP
对于Laravel 5.5核心架构的深入理解
Feb 22 PHP
PHP文件操作实例总结【文件上传、下载、分页】
Dec 08 PHP
ThinkPHP框架实现FTP图片上传功能示例
Apr 08 PHP
Laravel5.5+ 使用API Resources快速输出自定义JSON方法详解
Apr 06 PHP
PHP使用Session实现上传进度功能详解
Aug 06 #PHP
PHP使用ajax的post方式下载excel文件简单示例
Aug 06 #PHP
PHP中的自动加载操作实现方法详解
Aug 06 #PHP
Thinkphp自定义生成缩略图尺寸的方法
Aug 05 #PHP
thinkphp5.1框架中容器(Container)和门面(Facade)的实现方法分析
Aug 05 #PHP
RSA实现JS前端加密与PHP后端解密功能示例
Aug 05 #PHP
thinkPHP5框架接口写法简单示例
Aug 05 #PHP
You might like
PHP中根据IP地址判断城市实现城市切换或跳转代码
2012/09/04 PHP
基于PHP Web开发MVC框架的Smarty使用说明
2013/04/19 PHP
Codeigniter实现智能裁剪图片的方法
2014/06/12 PHP
JavaScript Chart 插件整理
2010/06/18 Javascript
JQuery 1.3.2以上版本中出现pareseerror错误的解决方法
2011/01/11 Javascript
js特效,页面下雪的小例子
2013/06/17 Javascript
js实现点小图看大图效果的思路及示例代码
2013/10/28 Javascript
js实现倒计时时钟的示例代码
2013/12/17 Javascript
AngularJS入门教程(一):静态模板
2014/12/06 Javascript
jQuery创建DOM元素实例解析
2015/01/19 Javascript
jQuery对象初始化的传参方式
2015/02/26 Javascript
JS中的hasOwnProperty()和isPrototypeOf()属性实例详解
2016/08/11 Javascript
react 父子组件之间通讯props
2018/09/08 Javascript
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
vue实现表单未编辑或未保存离开弹窗提示功能
2020/04/08 Javascript
python实现apahce网站日志分析示例
2014/04/02 Python
python搭建微信公众平台
2016/02/09 Python
离线安装Pyecharts的步骤以及依赖包流程
2020/04/23 Python
使用Python获取网段IP个数以及地址清单的方法
2018/11/01 Python
python实现祝福弹窗效果
2019/04/07 Python
linux下安装python3和对应的pip环境教程详解
2019/07/01 Python
python 实现return返回多个值
2019/11/19 Python
Python爬虫实现模拟点击动态页面
2020/03/05 Python
享受加州生活方式的时尚舒适:XCVI
2018/07/09 全球购物
Interflora澳大利亚:同日鲜花速递
2019/06/25 全球购物
财务主管自我鉴定
2014/01/17 职场文书
说明书怎么写
2014/05/06 职场文书
参赛口号
2014/06/16 职场文书
机关作风整顿个人整改措施2014
2014/09/17 职场文书
异地年检委托书范本
2014/09/24 职场文书
在校学生证明格式
2015/06/24 职场文书
学会感恩主题班会
2015/08/12 职场文书
SQLServer2008提示评估期已过解决方案
2021/04/12 SQL Server
sql注入教程之类型以及提交注入
2021/08/02 MySQL
MySQL分区表管理命令汇总
2022/03/21 MySQL
python 镜像环境搭建总结
2022/09/23 Python