yii源码一 -- CComponent
CComponent:
path:framework/base/CComponent.php
overview:This file contains the foundation classes for component-based and event-driven programming.
(包含基于组件和事件驱动编程的基础类,是所有components的基类)
1.property定义
$a=$component->text; // equivalent to $a=$component->getText();
$component->text='abc'; // equivalent to $component->setText('abc');
2.event事件定义
1)事件句柄function handlerName($event) {}
function eventHandler($event) { ... }
添加事件句柄到事件:(也可用attachEventHandler)
$component->onClick=$callback; // or $component->onClick->add($callback);
2)事件:事件名称必须以on开头
3)启用事件raiseEvent()
public function onClick($event){
$this->raiseEvent('onClick',$event);
}
3.behaviors行为
行为是附加到组件components上的实例。可以添加(attachBehavior),拆卸(detachBehavior),也可以启用(enableBehavior)、禁用(disableBehavior).
注意:1.属性名(property)和事件名(event)大小写敏感。
源码分析:
1.重写:
重写__get()和__set()两个魔术方法,便于可以直接调用和设置模型的私有属性;
重写__isset()和__unset()两个魔术方法,便于判断模型的私有属性是否设置和清空属性值;
重写__call()魔术方法,便于调用不存在的或者私有的类方法。
2.事件的有无判断和启用;
3.行为Behavior的添加、删除、启用、禁用;
4.Evaluates a PHP expression。
重点分析魔术方法:__set():
比如实例化后$userModel=new User();然后提交表单的时候$userModel->attributs = $_POST;(关键在这步).
public function __set($name,$value)
{
/**
* 当执行$userModel->attributes=$_POST时:
* 1.因为没有attributes属性,所以会调用此魔术方法__set();
* 2.传进来的值是:$name="setattributes",
$value = array(3) {
["username"]=>
string(5) "admin"
["password"]=>
string(9) "admin"
["rememberMe"]=>
string(1) "0"
}
* 3.'set'.$name返回的值是:setattributes;
* 4.因此当method_exists($this,$setter)存在这个方法的时候会调用
* $this->setattributes()方法。而setattributes()在/base/CModel.php
* 里面进行了处理.
*/
$setter='set'.$name;//得到$setter='setattributes';
if(method_exists($this,$setter))
return $this->$setter($value);//调用$this->setattributes($value);
类:CEvent
overview:CEvent is the base class for all event classes.
类:CEnumerable
overview:CEnumerable is the base class for all enumerable types.
用法:
class TextAlign extends CEnumerable{
const Left='Left';
const Right='Right';
}
调用:TextAlign::Left。
tips:The constant name must be the same as the constant value.
yii源码一 -- CComponent的更多相关文章
- Yii源码阅读笔记(一)
今天开始阅读yii2的源码,想深入了解一下yii框架的工作原理,同时学习一下优秀的编码规范和风格.在此记录一下阅读中的小心得. 每个框架都有一个入口文件,首先从入口文件开始,yii2的入口文件位于we ...
- Yii源码阅读笔记(三十五)
Container,用于动态地创建.注入依赖单元,映射依赖关系等功能,减少了许多代码量,降低代码耦合程度,提高项目的可维护性. namespace yii\di; use ReflectionClas ...
- Yii源码阅读笔记(三十四)
Instance类, 表示依赖注入容器或服务定位器中对某一个对象的引用 namespace yii\di; use Yii; use yii\base\InvalidConfigException; ...
- Yii源码阅读笔记(三十三)
ServiceLocator,服务定位类,用于yii2中的依赖注入,通过以ID为索引的方式缓存服务或则组件的实例来定位服务或者组件: namespace yii\di; use Yii; use Cl ...
- Yii源码阅读笔记(三十二)
web/Application类的注释,继承base/Application类,针对web应用的一些处理: namespace yii\web; use Yii; use yii\base\Inval ...
- Yii源码阅读笔记(三十一)
Widget类中开始,获取视图对象,获取widget ID,渲染视图,获取路径方法注释: private $_id; /** * Returns the ID of the widget. * 返回插 ...
- Yii源码阅读笔记(三十)
Widget类是所有小部件的基类,开始,结束和渲染小部件内容的方法的注释: namespace yii\base; use Yii; use ReflectionClass; /** * Widget ...
- Yii源码阅读笔记(二十九)
动态模型DynamicModel类,用于实现模型内数据验证: namespace yii\base; use yii\validators\Validator; /** * DynamicModel ...
- Yii源码阅读笔记(二十八)
Yii/web中的Controller类,实现参数绑定,启动csrf验证功能,重定向页面功能: namespace yii\web; use Yii; use yii\base\InlineActio ...
随机推荐
- ASP.NET Web API实践系列06, 在ASP.NET MVC 4 基础上增加使用ASP.NET WEB API
本篇尝试在现有的ASP.NET MVC 4 项目上增加使用ASP.NET Web API. 新建项目,选择"ASP.NET MVC 4 Web应用程序". 选择"基本&q ...
- Android按键添加和处理的方案
Android按键添加和处理的方案 版本号 说明 作者 日期 1.0 Android按键添加和处理的方案 Sky Wang 2013/06/18 需求:Android机器上有个W ...
- C#编程(二十一)----------扩展方法
C#中的扩展方法 有许多扩展类的方式.如果有类的源代码,继承就是给类添加功能的好方法.但是如果没有源代码,怎么办?吃屎可以使用扩展方法,它允许改变一个类,但不需要该类的源代码.扩展方法是静态方法,它是 ...
- 泛泰A860(高通8064 cpu 1080p) 刷4.4专用中文recovery TWRP2.7.1.2版(三版通刷)
欢迎关注泛泰非盈利专业第三方开发团队 VegaDevTeam (本team 由 syhost suky zhaochengw(z大) xuefy(大星星) tenfar(R大师) loogeo cr ...
- Tomcat启动log打印到INFO: At least one JAR was scanned for TLDs yet contained no TLD各种解决方式
问题: 启动tomcat时,catalina.out日志打印到如下内容就停止不动了,也不报错 SEVERE: FarmWarDeployer can only work as host cluster ...
- Java 单例模式的常见应用场景
单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此 ...
- SharePoint Online 切换经典视图
SharePoint online 默认是现代视图,我们可以通过Powershell命令切换默认视图. 以下,是完成的Powershell命令: # This file uses CSOM. Repl ...
- 简析Window、Activity、DecorView以及ViewRoot之间的错综关系
一.职能简介 Activity Activity并不负责视图控制,它只是控制生命周期和处理事件.真正控制视图的是Window.一个Activity包含了一个Window,Window才是真正代表一个窗 ...
- 通用的Bitmap压缩算法,进一步节约内存(推荐)
前几天我写了一篇通过压缩Bitmap,减少OOM的文章,那篇文章的目的是按照imageview的大小来压缩bitmap,让bitmap的大小正好是imageview.但是那种算法的通用性比较差,仅仅能 ...
- Unable to execute dex: Multiple dex files define 的解决方法
我们在引入library时可能会出现这个错误 比如: [2013-11-05 14:22:15 - Dex Loader] Unable to execute dex: Multiple dex fi ...