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 相关文章推荐
浅谈Windows下 PHP4.0与oracle 8的连接设置
Oct 09 PHP
swfupload 多文件上传实现代码
Aug 27 PHP
细谈php中SQL注入攻击与XSS攻击
Jun 10 PHP
php中3种方法统计字符串中每种字符的个数并排序
Aug 27 PHP
phpexcel导出excel的颜色和网页中的颜色显示不一致
Dec 11 PHP
CI框架中zip类应用示例
Jun 17 PHP
PHP中的闭包(匿名函数)浅析
Feb 07 PHP
thinkphp命名空间用法实例详解
Dec 30 PHP
Zend Framework教程之MVC框架的Controller用法分析
Mar 07 PHP
php文件缓存方法总结
Mar 16 PHP
php关闭warning问题的解决方法
May 17 PHP
Ubuntu彻底删除PHP7.0的方法
Jul 27 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
基于MySQL分区性能的详细介绍
2013/05/02 PHP
php保存二进制原始数据为图片的程序代码
2014/10/14 PHP
编写PHP脚本过滤用户上传的图片
2015/07/03 PHP
php下载文件,添加响应头的简单实例
2016/09/22 PHP
PHP十六进制颜色随机生成器功能示例
2017/07/24 PHP
解析javascript 数组以及json元素的添加删除
2013/06/26 Javascript
jquery.autocomplete修改实现键盘上下键自动填充示例
2013/11/19 Javascript
跟我学习javascript的执行上下文
2015/11/18 Javascript
JavaScript获取当前运行脚本文件所在目录的方法
2016/02/03 Javascript
AngularJS ng-change 指令的详解及简单实例
2016/07/30 Javascript
js实现简单的计算器功能
2017/01/16 Javascript
React Router基础使用
2017/01/17 Javascript
JavaScript实现分页效果
2017/03/28 Javascript
layui表格checkbox选择全选样式及功能的实例
2018/03/07 Javascript
React Native中Mobx的使用方法详解
2018/12/04 Javascript
JQuery Ajax执行跨域请求数据的解决方案
2018/12/10 jQuery
PM2自动部署代码步骤流程总结
2018/12/10 Javascript
[01:11:37]完美世界DOTA2联赛PWL S2 SZ vs FTD.C 第一场 11.19
2020/11/19 DOTA
[47:31]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第一场 12.12
2020/12/16 DOTA
Tornado服务器中绑定域名、虚拟主机的方法
2014/08/22 Python
python的内存管理和垃圾回收机制详解
2019/05/18 Python
基于Python的图像数据增强Data Augmentation解析
2019/08/13 Python
flask框架渲染Jinja模板与传入模板变量操作详解
2020/01/25 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
2020/04/25 Python
python如何调用百度识图api
2020/09/29 Python
详解CSS3中使用gradient实现渐变效果的方法
2015/08/18 HTML / CSS
html5 http的轮询和Websocket原理
2018/10/19 HTML / CSS
Anya Hindmarch官网:奢侈设计师手袋及配饰
2018/11/15 全球购物
HashMap和Hashtable的区别
2013/05/18 面试题
小学生学习感言
2014/03/10 职场文书
实习介绍信模板
2015/01/30 职场文书
遗失证明范文
2015/06/19 职场文书
大学生安全教育心得体会
2016/01/15 职场文书
领导干部学习心得体会
2016/01/23 职场文书
Python超简单容易上手的画图工具库推荐
2021/05/10 Python
SpringBoot 集成Redis 过程
2021/06/02 Redis