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 ...
随机推荐
- Revit API创建几何实体Solid并找到与之相交的元素
几何实体的创建方法之一:构成封闭底面,指定拉伸方向与拉伸高度.GeometryCreationUtilities ; , pt.Y - dBoxLength / , pt.Z); ...
- NavigateToPageAction打开新页面
首先要加上两个命名空间 分别为: xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.In ...
- sql select 0 字段
关于 select 语句中 0 某字段名字,的意思是:该某字段是不在指定的表中的,那么如果要在子查询中利用这个指定的表,且带有这个字段,那么就用这个方式来添加该字段,并以0来初始化该字段. 如下例: ...
- iPhone上将短信内容发送到指定邮箱的方法
iPhone上将短信内容发送到指定邮箱的方法 迄今为止,移动应用安全基本聚焦在以下几个方面,一是移动设备管理BYOD(bring your own device),二是移动恶意软件分析,三是移动设备用 ...
- 用level-list让同一个ImageView根据条件来显示不同的内容
感谢:http://blog.sina.com.cn/s/blog_6111ce890100psq9.html 有时候,我们为了在一个ImageView中显示不同的图片,平时往往会使用: if (条件 ...
- C#多线程读写同一文件处理
在多线程访问读写同一个文件时,经常遇到异常:“文件正在由另一进程使用,因此该进程无法访问此文件”. 多线程访问统一资源的异常, 解决方案1,保证读写操作单线程执行,可以使用lock 解决方案2,使用S ...
- [转]Zend Studio中将tab转换为4个空格
From : http://our2848884.blog.163.com/blog/static/14685483420129318619284/ 例子如下: 1 选中需要转换的区域 2 Ct ...
- 使用ASP.NET AJAX与Bootstrap 弹窗解决方案
我在做采购系统时,因为使用了ASP.NET AJAX的UpdatePanel的控件,可以使得页面局部刷新显示.但是使用起来问题还是很多. 下面列出了一种情况,花了将近5个小时才算解决,虽然不是很完美, ...
- ArcGIS Server 10 for java 注册SOE出现的问题
一个SOE 需要register,但是报错 Manage Extensions Refresh Unable to register extension. com.esri.arcgis.intero ...
- iOS:简易的音视屏播放框架XYQPlayer
一.前缀 一直都想好好学学音视频这方面的知识,抽了几个周末参考一些资料,尝试着写了一个简易的音视频播放框架,支持音视频播放.视频截图.音乐缓存,其实吧,也就是尽可能的封装罢了,方便以后自己使用.目前只 ...