Yii Framework 开发教程(6) CComponent 组件

2023-11-12



在Hangman中定义的GameController使用到一些属性word,可以使用$this->word 的格式来读写这个属性,但实际上在GameController对应到这个属性的方法为

  1. /** 
  2.  * @return string the word to be guessed. This value is persistent 
  3.  * during the whole game session. 
  4.  */  
  5. public function getWord()  
  6. {  
  7.     return $this->getPageState('word');  
  8. }  
  9.   
  10. /** 
  11.  * @param string the word to be guessed. This value is persistent 
  12.  * during the whole game session. 
  13.  */  
  14. public function setWord($value)  
  15. {  
  16.     $this->setPageState('word',$value);  
  17. }  
/**
 * @return string the word to be guessed. This value is persistent
 * during the whole game session.
 */
public function getWord()
{
	return $this->getPageState('word');
}

/**
 * @param string the word to be guessed. This value is persistent
 * during the whole game session.
 */
public function setWord($value)
{
	$this->setPageState('word',$value);
}

也就是通过定义getWord, setWord 的方式定义一个支持读写操作的属性word(名字是大小写不敏感的).当读取属性时,getWord() 就会被调用,其返回值则成为属性值;相似的, 当写入属性时,setWord() 被调用。如果 setter 方法没有定义,则属性将是只读的, 如果对其写入则会抛出一个异常。使用 getter 和 setter 方法定义一个属性有一个好处:即当读取或写入属性时, 可以执行额外的逻辑(例如,执行验证,触发事件)。
基类 CComponent 除了可以定义属性外,还支持触发事件,和ASP.Net中UI组件非常类似。

组件事件是一些特殊的属性,它们使用一些称作 事件句柄 (event handlers)的方法作为其值。 附加(分配)一个方法到一个事件将会引起方法在事件被唤起处自动被调用。因此, 一个组件的行为可能会被一种在部件开发过程中不可预见的方式修改。

组件事件以 on 开头的命名方式定义。和属性通过 getter/setter 方法来定义的命名方式一样, 事件的名称是大小写不敏感的。以下代码定义了一个 onClicked 事件:

  1. public function onClicked($event)  
  2. {  
  3.     $this->raiseEvent('onClicked'$event);  
  4. }  
public function onClicked($event)
{
    $this->raiseEvent('onClicked', $event);
}

这里作为事件参数的 $event 是 CEvent 或其子类的实例。

我们可以附加一个方法到此 event,如下所示:

$component->onClicked=$callback;
这里的 $callback 指向了一个有效的 PHP 回调。它可以是一个全局函数也可以是类中的一个方法。 如果是后者,它必须以一个数组的方式提供: array($object,’methodName’).

事件句柄的结构如下:

  1. function methodName($event)  
  2. {  
  3.     ......  
  4. }  
function methodName($event)
{
    ......
}

这里的 $event 即描述事件的参数(它来源于 raiseEvent() 调用)。$event 参数是 CEvent 或其子类的实例。 至少,它包含了关于谁触发了此事件的信息。

从版本 1.0.10 开始,事件句柄也可以是一个PHP 5.3以后支持的匿名函数。例如,

  1. $component->onClicked=function($event) {  
  2.     ......  
  3. }  
$component->onClicked=function($event) {
    ......
}

如果我们现在调用 onClicked(),onClicked 事件将被触发(在 onClicked() 中), 附属的事件句柄将被自动调用。

一个事件可以绑定多个句柄。当事件触发时, 这些句柄将被按照它们绑定到事件时的顺序依次执行。如果句柄决定组织后续句柄被执行,它可以设置 $event->handled 为 true。

从版本 1.0.2 开始,组件已添加了对 mixin 的支持,并可以绑定一个或多个行为。 行为 是一个对象,其方法可以被它绑定的部件通过收集功能的方式来实现 继承(inherited), 而不是专有化继承(即普通的类继承).一个部件可以以’多重继承’的方式实现多个行为的绑定.

行为类必须实现 IBehavior 接口。 大多数行为可以继承自 CBehavior 。如果一个行为需要绑定到一个 模型, 它也可以从专为模型实现绑定特性的 CModelBehavior 或 CActiveRecordBehavior 继承。

要使用一个行为,它必须首先通过调用此行为的 attach() 方法绑定到一个组件。然后我们就可以通过组件调用此行为方法:

  1. // $name 在组件中实现了对行为的唯一识别  
  2. $component->attachBehavior($name,$behavior);  
  3. // test() 是行为中的方法。  
  4. $component->test();  
// $name 在组件中实现了对行为的唯一识别
$component->attachBehavior($name,$behavior);
// test() 是行为中的方法。
$component->test();
已绑定的行为可以像一个组件中的普通属性一样访问。 例如,如果一个名为 tree 的行为绑定到了一个组件,我们就可以通过如下代码获得指向此行为的引用。

  1. $behavior=$component->tree;  
  2. // 等于下行代码:  
  3. // $behavior=$component->asa('tree');  
  4. 行为是可以被临时禁止的,此时它的方法开就会在组件中失效.例如:  
  5.   
  6. $component->disableBehavior($name);  
  7. // 下面的代码将抛出一个异常  
  8. $component->test();  
  9. $component->enableBehavior($name);  
  10. // 现在就可以使用了  
  11. $component->test();  
$behavior=$component->tree;
// 等于下行代码:
// $behavior=$component->asa('tree');
行为是可以被临时禁止的,此时它的方法开就会在组件中失效.例如:

$component->disableBehavior($name);
// 下面的代码将抛出一个异常
$component->test();
$component->enableBehavior($name);
// 现在就可以使用了
$component->test();

两个同名行为绑定到同一个组件下是有可能的.在这种情况下,先绑定的行为则拥有优先权.

当和 events, 一起使用时,行为会更加强大. 当行为被绑定到组件时,行为里的一些方法就可以绑定到组件的一些事件上了. 这样一来,行为就有机观察或者改变组件的常规执行流程.

自版本 1.1.0 开始,一个行为的属性也可以通过绑定到的组件来访问。 这些属性包含公共成员变量以及通过 getters 和/或 setters 方式设置的属性。 例如, 若一个行为有一个 xyz 的属性,此行为被绑定到组件 $a,然后我们可以使用表达式 $a->xyz 访问此行为的属性。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Yii Framework 开发教程(6) CComponent 组件 的相关文章

随机推荐

  • 解决Nginx部署Vue项目第一次访问正常第二次访问404的问题

    location add header Access Control Allow Origin root data static project dist try files uri uri index html index index h
  • DNS资源记录详解

    资源记录 resourse record 就是域名服务器保存的记录 也是解析器请求的内容 资源记录保存在zone文件中 域 domain 以 www baidu com 为例 com是一个域 baidu com是一个域 他是com域的一个子
  • 啥是ddl?

    我们在安装软件的时候 经常出现某一个dll文件丢失 无法安装 让人头痛不已 那么到底啥是ddl 还是有度娘好呀 下面是百度百科的词条 数据库模式定义语言DDL Data Definition Language 是用于描述数据库中要存储的现实
  • NFTScan NFT API 在 NFTFi 开发中的应用

    NFTFi 是 NFT 和 Finance 的缩写 旨在 增加 NFT 流动性 提供现金流 NFTFi 是为 NFT 提供金融实用性的去中心化协议和应用程序的新兴生态系统 及使用 NFT 作为基础层在其上建设经济基础设施 在实践中 NFTF
  • 7.7 SHEIN希音笔试

    投的Java工程师岗位 题型为10道单选 5道多选 1道算法题 1道sql题 时长1h 选择题 1 spring事物的传播特性 错误的是 PROPAGATION REQUIRED 支持当前事务 如果当前没有事务 就抛出异常 应该是 支持当前
  • wireshark流量分析网络安全

    目录 前言 题目1 题目2 题目3 题目4 题目5 题目6 题目7 题目8 前言 这是关于一篇wireshark分析数据包的文章 主要是网络安全里的应用 讲述了wireshark的使用方法 主要使用的事wrieshark里的追踪流 欢迎大家
  • elementUI 下拉框select 为多选 赋值回显问题

    下拉框为多选时 绑定的值为数组状态 所以点击编辑赋值时 需要处理为数组 但我遇到的问题是 可以赋值 但不是想要的结果 我想要显示label 但显示的是value 不想得到的效果 想要的是 在赋值后面加 map Number 就可以对号入座了
  • 【翻译】 使用 SFrame 进行可靠的用户空间堆栈跟踪

    请考虑订阅 LWN订阅是 LWN net 的生命线 如果您喜欢这些内容并希望看到更多 您的订阅将有助于确保 LWN 继续蓬勃发展 请访问此页面加入我们 让 LWN 继续在网络上传播 作者 Jonathan Corbet 2023 年 5 月
  • html页面传list,后端list集合中的数据传递到前台HTML中显示(表格形式)

    关键字 web项目中前后台数据传递问题 在学习web项目的过程中 我们肯定会遇到前后台数据交换问题 这个问题我也思考了很久 今天借此总结一下 由于博主水平有限 如有不当之处 还请大家多多指正 废话不所说进入正题 一 HTML页面通过ajax
  • 《Thinking_in_java_4th》持续输出中.......

    目录标题 一 文章目录 二 源码链接 一 文章目录 Java设计者们说过 设计这门语言的灵感主要来自C Java编程思想 第 2章 一切都是对象 Java编程思想 第 4章 控制执行流程 Java编程思想 第14章 类型信息 Java编程思
  • 排名前 16 的 Java 工具类

    原链接 https mp weixin qq com s s6IfovcE LGlZJxIKfT dw 目录 org apache commons io IOUtils org apache commons io FileUtils org
  • 磁耦隔离与传统隔离的区别

    磁耦隔离与传统隔离的区别 传统隔离技术 传统的隔离方式有哪些 这里有三种通常的隔离技术 光电隔离 变压器隔离 磁耦是芯片级变压器隔离技术 电容隔离 在体积 成本 性能等各方面都有优缺点 传统的隔离方式是光电隔离 什么是光耦 什么是光隔离 光
  • Qt GraphicsView框架中实现多个item之间的层次调整功能

    目的 要实现GraphicsView中多个item之间的层次调整功能 即 选中的item可以实现 移动至顶层 移动至底层 上移一层 下移一层 等功能 之前盲目地认为Qt API会提供 获取与之相邻的sibling item 类似这样的接口
  • 2023全新SF授权系统源码 V3.7全开源无加密版本,亲测可用

    2023全新SF授权系统源码 V3 7全开源无加密版本 网站搭建很简单 大致看来一下应该域名解析后上传源码解压 访问域名 install就能直接安装 程序功能简介 1 盗版入库 26种 2 快捷登录 3 采用layuiadmin框架 4 易
  • ASP.NET core MVC动作过滤器执行顺序

    using Microsoft AspNetCore Mvc Filters using System using System Threading Tasks namespace dotnet core Filter public cla
  • 两片74161实现60进制_74LS161设计60进制计数器-数电课程设计

    计数器是一个用以实现计数功能的时序部件 它不仅可用来及脉冲数 还常用作数子系统的定时 分频和执行数字运算以及其它特定的逻辑功能 计数器种类很多 按构成计数器中的各触发器是否使用一个时钟脉冲源来分 有同步计数器和异步计数器 根据计数制的不同
  • js怎么改变样式中的属性值

    可以使用JavaScript来改变HTML元素的样式属性值 具体方法如下 通过id属性获取要修改的元素对象 var obj document getElementById element id 修改元素的样式属性值 obj style pr
  • 错误: 至少有一个需要的隐性或转发依赖函数没找到。_【翻译】自动柯里化Rust函数...

    原文标题 Auto currying Rust Functions 原文链接 https peppe rs posts auto currying rust functions 公众号 Rust碎碎念 本文包含Rust中过程宏 proced
  • 《疯狂Java讲义》读书笔记(一):面向对象,数据类型和运算符,流程控制与数组

    序言 疯狂Java讲义 这本书深入介绍了Java编程的相关方面 全书内容覆盖了Java的基本语法结构 Java的面向对象特征 Java集合框架体系 Java泛型 异常处理 JavaGUI编程 JDBC数据库编程 Java注释 Java的IO
  • Yii Framework 开发教程(6) CComponent 组件

    在Hangman中定义的GameController使用到一些属性word 可以使用 this gt word 的格式来读写这个属性 但实际上在GameController对应到这个属性的方法为 php view plain copy pr