yii CComponent组件 实例说明

yii中的module,controller都是CComponent的子类,可以说yii的架构基石就是依托在CCompnent基础上的,这里研究下CComponent。另外写一个简单的组件应用示例。希望可以帮助到大家。

component有三个基础特性,属性(Property),事件(Event),行为(Behavior)。就从这三点阐述一下吧,个人感觉掌握了这三点,就基本掌握了component的本质

属性:

故名思意,该特性描述组件的一系列属性。通过 $compontent -> property_name 进行赋值和提取。系统中是通过 __get 和 __set 来实现的。

事件:

事件可以认为是一类特殊的属性。之所以特殊,是因为他可以把事件处理句柄和事件名关联在一起,当事件被唤起时,事件处理句柄被执行。

事件的名字以”on”开头,在__get()和__set()里可以通过这个来区别属性和事件。事件被记录在组件的$_e[]数组中

定义事件时,要有onEventName的方法,这样系统才可以把事件注册具体的句柄上,激发事件时,同样使用onEventName方法,里面调用raiseEvent.

事件句柄必须定义为 function methodName($event)

注册事件的方法:

//添加一个全局函数到事件处理

$component-> onBeginRequest=”logRequest”;

//添加一个类静态方法到事件处理

$component-> onBeginRequest=array(“CLog”,” logRequest”);

//添加一个对象方法到事件处理

$component-> onBeginRequest=array($mylog,” logRequest”);

唤起事件的方法:

$component ->raiseEvent('onBeginRequest ', $event);

他会自动调用:

logRequest($event), Clog:: logRequest($event)和$mylog.logRequest($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()

编写一个组件示例,希望可以帮助大家很好的理解

protected/components/TestCom.php

<?php
/*
* author:wully_happy@163.com
* component function test
*/
class TestCom extends CComponent{ #属性的读写操作,可以根据读写是否开放,来决定是否设置set和get方法
#可以通过$com -> atr来调用
private $atr = "";
public function getAtr(){
return $this -> atr;
} #可以通过$com -> atr来调用
public function setAtr($v){
$this -> atr = $v;
}
public static function eventMethod1($event){
echo "run enentMethod1!/n";
}
public function eventMethod2($event){
echo "run enentMethod2!/n";
} public function onTest($event){
$this->raiseEvent('onTest', $event);
} public function testEvent(){
##register event
$callback = array();
$callback = array("TestCom","eventMethod1");
$this -> onTest = $callback;
$callback = array($this,"eventMethod2");
$this -> onTest = $callback;
$this -> onTest(new CEvent());
}
public function testBehavior(){
$name = "testBehavior";
$behavior = new TestBehavior();
$this->attachBehavior($name,$behavior);
$this -> FunOfTestBehavior();
}
}
?>

protected/components/TestBehavior.php

<?php
/*
* author:wully_happy@163.com
* component function test
*/
class TestBehavior extends CBehavior{
public function FunOfTestBehavior(){
echo "this function from TestBehavior class!/n";
}
}

protected/controllers/TestController.php

<?php
/*
* author:wully_happy@163.com
* component function test
*/
class TestController extends Controller{
public function actionTestAtr(){
$com = new testCom();
$com -> atr = "atr";
echo $com -> atr;
}
public function actionTestEvent(){
$com = new testCom();
$com -> testEvent();
}
public function actionTestBehavior(){
$com = new testCom();
$com -> testBehavior();
}
}
?>

参考资料:http://www.yiiframework.com/doc/guide/1.1/en/basics.component

yii CComponent组件 实例说明1的更多相关文章

  1. (转)Yii的组件机制之一:组件基础类CComponent分析

    Yii的组件机制 组件机制,是Yii整个体系的思想精髓,在使用Yii之前,最应该先了解其组件机制,如果不了解这个机制,那么阅读Yii源代码会非常吃力.组件机制给Yii框架赋予了无穷的灵活性和可扩展性, ...

  2. Vue组件实例间的直接访问

    前面的话 有时候需要父组件访问子组件,子组件访问父组件,或者是子组件访问根组件. 在组件实例中,Vue提供了相应的属性,包括$parent.$children.$refs和$root,这些属性都挂载在 ...

  3. 在被vue组件引用的 js 文件里获取组件实例this

    思路: 通过调用函数 把 组件实例this  传递 到 被应用的 js文件里 实例: 文件结构 在SendThis.vue 文件中引用 了modalConfig.js import modalConf ...

  4. vue构造函数(根实例化时和组件实例对象选项)参数:选项详解

    实例选项(即传给构造函数的options):数据,DOM,生命周期钩子函数,资源,组合,其他 数据 data 属性能够响应数据变化,当这些数据改变时,视图会进行重渲染. 访问方式: 1.通过 vm.$ ...

  5. BootStrap fileinput.js文件上传组件实例代码

    1.首先我们下载好fileinput插件引入插件 ? 1 2 3 <span style="font-size:14px;"><link type="t ...

  6. COM/DCOM开发练习之进程内组件实例

    作者 : 卿笃军 题目说明: 仿照例题,在其基础上实现下面功能: 1)使用C++语言实现进程内组件,组件提供复数的加.减.乘.除等计算服务:client部分包含录入(实部和虚部分开录入)和查询部分. ...

  7. React获取组件实例

    1. 直接new Component() 组件本身也是class,可以new,这样的组件实例意义不大 componentInstance = new Component(); 2. ReactDOM. ...

  8. jQuery.uploadify文件上传组件实例讲解

    1.jquery.uploadify简介 在ASP.NET中上传的控件有很多,比如.NET自带的FileUpload,以及SWFUpload,Uploadify等等,尤其后面两个控件的用户体验比较好, ...

  9. vue-learning:30 - component - 组件实例的引用方式

    组件实例的引用方式 ref / $refs $root $parent $children 扩展查找任意组件实例的方法 在vue开发的项目中,通常会以一棵嵌套的组件树的形式来组织项目. 都存在着一个根 ...

随机推荐

  1. ROS知识(2)----理解ROS系统结构

    学习新事物,方法高于技术本身,如果没有把握"BIG PICTURE"的话很难理解进去.通过以下几点进行理解ROS: ROS实际上不是操作系统,他只是一个通信的框架,一个代码管理的架 ...

  2. linux常用命令:ps 命令

    Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信 ...

  3. python进程join()函数理解

    Join()是主程序等我这个进程执行完毕了,程序才往下走  

  4. 关键词提取自动摘要相关开源项目,自动化seo

    关键词提取自动摘要相关开源项目 GitHub - hankcs/HanLP: 自然语言处理 中文分词 词性标注 命名实体识别 依存句法分析 关键词提取 自动摘要 短语提取 拼音 简繁转换https:/ ...

  5. 关于webpack的path和publicPath。

    path:所有输出文件的目标路径; publicPath:输出解析文件的目录,url 相对于 HTML 页面 区别:path是webpack所有文件的输出的路径,必须是绝对路径,比如:output输出 ...

  6. 如何使用Unity制作虚拟导览(一)

    https://www.cnblogs.com/yangyisen/p/5108289.html Unity用来制作游戏已经是目前市场上的一个发展趋势,而且有越来越多的公司与开发者不断的加入,那么Un ...

  7. OpenCV中HSV颜色模型及颜色分量范围

    HSV颜色模型 HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)..这 ...

  8. 关于linux中的上下文切换

    对于linux中的上下文一直以来没有特别的关注其合理范围应该是多少(关于上下文切换的概念,网上已经有很多解释了,再次不再重复),白天偶尔注意到了一下,晚上特地看了下白天负载和和收盘后的负载如下(服务器 ...

  9. switch to hexo !

    用 hexo 搭了个博客 但是由于本博客内容过多,所以对于少数内容搬迁,而且本博客和那个博客相关联,但是这个博客不再更新. 新站地址 再见!

  10. 20145221《网络对抗》PC平台逆向破解

    20145221<网络对抗>PC平台逆向破解 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户 ...