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的更多相关文章

  1. Yii源码阅读笔记(一)

    今天开始阅读yii2的源码,想深入了解一下yii框架的工作原理,同时学习一下优秀的编码规范和风格.在此记录一下阅读中的小心得. 每个框架都有一个入口文件,首先从入口文件开始,yii2的入口文件位于we ...

  2. Yii源码阅读笔记(三十五)

    Container,用于动态地创建.注入依赖单元,映射依赖关系等功能,减少了许多代码量,降低代码耦合程度,提高项目的可维护性. namespace yii\di; use ReflectionClas ...

  3. Yii源码阅读笔记(三十四)

    Instance类, 表示依赖注入容器或服务定位器中对某一个对象的引用 namespace yii\di; use Yii; use yii\base\InvalidConfigException; ...

  4. Yii源码阅读笔记(三十三)

    ServiceLocator,服务定位类,用于yii2中的依赖注入,通过以ID为索引的方式缓存服务或则组件的实例来定位服务或者组件: namespace yii\di; use Yii; use Cl ...

  5. Yii源码阅读笔记(三十二)

    web/Application类的注释,继承base/Application类,针对web应用的一些处理: namespace yii\web; use Yii; use yii\base\Inval ...

  6. Yii源码阅读笔记(三十一)

    Widget类中开始,获取视图对象,获取widget ID,渲染视图,获取路径方法注释: private $_id; /** * Returns the ID of the widget. * 返回插 ...

  7. Yii源码阅读笔记(三十)

    Widget类是所有小部件的基类,开始,结束和渲染小部件内容的方法的注释: namespace yii\base; use Yii; use ReflectionClass; /** * Widget ...

  8. Yii源码阅读笔记(二十九)

    动态模型DynamicModel类,用于实现模型内数据验证: namespace yii\base; use yii\validators\Validator; /** * DynamicModel ...

  9. Yii源码阅读笔记(二十八)

    Yii/web中的Controller类,实现参数绑定,启动csrf验证功能,重定向页面功能: namespace yii\web; use Yii; use yii\base\InlineActio ...

随机推荐

  1. 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 ...

  2. Android按键添加和处理的方案

    Android按键添加和处理的方案  版本号 说明 作者 日期  1.0  Android按键添加和处理的方案 Sky Wang  2013/06/18        需求:Android机器上有个W ...

  3. C#编程(二十一)----------扩展方法

    C#中的扩展方法 有许多扩展类的方式.如果有类的源代码,继承就是给类添加功能的好方法.但是如果没有源代码,怎么办?吃屎可以使用扩展方法,它允许改变一个类,但不需要该类的源代码.扩展方法是静态方法,它是 ...

  4. 泛泰A860(高通8064 cpu 1080p) 刷4.4专用中文recovery TWRP2.7.1.2版(三版通刷)

    欢迎关注泛泰非盈利专业第三方开发团队 VegaDevTeam  (本team 由 syhost suky zhaochengw(z大) xuefy(大星星) tenfar(R大师) loogeo cr ...

  5. 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 ...

  6. Java 单例模式的常见应用场景

    单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此 ...

  7. SharePoint Online 切换经典视图

    SharePoint online 默认是现代视图,我们可以通过Powershell命令切换默认视图. 以下,是完成的Powershell命令: # This file uses CSOM. Repl ...

  8. 简析Window、Activity、DecorView以及ViewRoot之间的错综关系

    一.职能简介 Activity Activity并不负责视图控制,它只是控制生命周期和处理事件.真正控制视图的是Window.一个Activity包含了一个Window,Window才是真正代表一个窗 ...

  9. 通用的Bitmap压缩算法,进一步节约内存(推荐)

    前几天我写了一篇通过压缩Bitmap,减少OOM的文章,那篇文章的目的是按照imageview的大小来压缩bitmap,让bitmap的大小正好是imageview.但是那种算法的通用性比较差,仅仅能 ...

  10. Unable to execute dex: Multiple dex files define 的解决方法

    我们在引入library时可能会出现这个错误 比如: [2013-11-05 14:22:15 - Dex Loader] Unable to execute dex: Multiple dex fi ...