0

0

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

黄舟

黄舟

发布时间:2016-12-27 11:19:00

|

1405人浏览过

|

来源于php中文网

原创

这篇文章可作为《yii框架分析(二)——ccomponent类剖析》的补充。

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两个成员变量,该图描述了对于这两个成员变量的调用流程。

367.jpg

(注:关于魔术方法__get和__set的使用,可参考:PHP基础之类和对象13——重载)

面向对象编程中直接定义一个成员变量就可以了,为什么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是事件处理函数链表。

墨鱼aigc
墨鱼aigc

一款超好用的Ai写作工具,为用户提供一键生成营销广告、原创文案、写作辅助等文字生成服务。

下载

368.jpg

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个魔术方法(这三个魔术方法的使用详见:PHP基础之类和对象13——重载)来实现“行为类绑定”这个特性,当调用CComponent类不存在的成员变量和成员方法的时候,CComponent类会通过这三个魔法方法在“动态绑定的行为对象”上进行查找。即将不存在的成员变量和成员方法路由到“动态绑定对象”上。

369.jpg

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

 以上就是Yii框架分析(五)——再谈CComponent基础类的内容,更多相关内容请关注PHP中文网(www.php.cn)!

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

17

2026.01.23

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

22

2026.01.23

yy漫画官方登录入口地址合集
yy漫画官方登录入口地址合集

本专题整合了yy漫画入口相关合集,阅读专题下面的文章了解更多详细内容。

91

2026.01.23

漫蛙最新入口地址汇总2026
漫蛙最新入口地址汇总2026

本专题整合了漫蛙最新入口地址大全,阅读专题下面的文章了解更多详细内容。

124

2026.01.23

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

14

2026.01.23

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

65

2026.01.22

PHP后端开发相关内容汇总
PHP后端开发相关内容汇总

本专题整合了PHP后端开发相关内容,阅读专题下面的文章了解更多详细内容。

59

2026.01.22

php会话教程合集
php会话教程合集

本专题整合了php会话教程相关合集,阅读专题下面的文章了解更多详细内容。

61

2026.01.22

宝塔PHP8.4相关教程汇总
宝塔PHP8.4相关教程汇总

本专题整合了宝塔PHP8.4相关教程,阅读专题下面的文章了解更多详细内容。

33

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Django 教程
Django 教程

共28课时 | 3.4万人学习

React 教程
React 教程

共58课时 | 4.1万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号