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 相关文章推荐
PHP4实际应用经验篇(6)
Oct 09 PHP
[原创]PHP中通过ADODB库实现调用Access数据库之修正版本
Dec 31 PHP
phpize的深入理解
Jun 03 PHP
php不用正则验证真假身份证
Nov 06 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(七)
Jun 23 PHP
thinkphp模板继承实例简述
Nov 26 PHP
php对象在内存中的存在形式分析
Feb 03 PHP
php使用substr()和strpos()联合查找字符串中某一特定字符的方法
May 12 PHP
php rmdir使用递归函数删除非空目录实例详解
Oct 20 PHP
PHP排序算法之基数排序(Radix Sort)实例详解
Apr 21 PHP
PHP多进程通信-消息队列使用
Mar 08 PHP
Yii使用DbTarget实现日志功能的示例代码
Jul 21 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
Protoss兵种介绍
2020/03/14 星际争霸
PHP学习笔记之数组篇
2011/06/28 PHP
php实现httpclient类示例
2014/04/08 PHP
javascript中的几个运算符
2007/06/29 Javascript
编写Js代码要注意的几条规则
2010/09/10 Javascript
基于jquery实现的表格分页实现代码
2011/06/21 Javascript
详细解密jsonp跨域请求
2015/04/15 Javascript
详解JavaScript中的异常处理方法
2015/06/16 Javascript
javascript通过获取html标签属性class实现多选项卡的方法
2015/07/27 Javascript
使用JQuery实现的分页插件分享
2015/11/05 Javascript
javascript求日期差的方法
2016/03/02 Javascript
vue2.x+webpack快速搭建前端项目框架详解
2017/11/30 Javascript
jQuery进阶实践之利用最优雅的方式如何写ajax请求
2017/12/20 jQuery
vue2 前端搜索实现示例
2018/02/26 Javascript
如何用input标签和jquery实现多图片的上传和回显功能
2018/05/16 jQuery
Layui数据表格之单元格编辑方式
2019/10/26 Javascript
js动态添加带圆圈序号列表的实例代码
2021/02/18 Javascript
python调用cmd命令行制作刷博器
2014/01/13 Python
python完成FizzBuzzWhizz问题(拉勾网面试题)示例
2014/05/05 Python
Python 不同对象比较大小示例探讨
2014/08/21 Python
Python守护进程用法实例分析
2015/06/04 Python
Python脚本实现自动将数据库备份到 Dropbox
2017/02/06 Python
Python使用剪切板的方法
2017/06/06 Python
简单谈谈python中的lambda表达式
2018/01/19 Python
Python基础之函数基本用法与进阶详解
2020/01/02 Python
在tensorflow中实现去除不足一个batch的数据
2020/01/20 Python
Python3实现建造者模式的示例代码
2020/06/28 Python
Ticketmaster德国票务网站:购买音乐会和体育等门票
2016/11/14 全球购物
梅西酒窖:Macy’s Wine Cellar
2018/01/07 全球购物
大一自我鉴定范文
2013/12/27 职场文书
局机关干部群众路线个人对照检查材料思想汇报
2014/10/05 职场文书
药品销售内勤岗位职责
2015/04/13 职场文书
同意报考公务员证明
2015/06/17 职场文书
党员发展大会主持词
2015/07/03 职场文书
2019优秀干部竞聘演讲稿范文!
2019/07/02 职场文书
千万级用户系统SQL调优实战分享
2022/03/03 MySQL