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. In-Place upgrade to Team Foundation Server (TFS) 2015 from TFS 2013Team Foundation Server TFS TFS 2015 TFS upgrade TFS with Sharepoint

    This upgrade document gives detailed step by step procedure for the In-Place upgrade from TFS 2013 t ...

  2. delphi 合并两个 Wav 文件流的函数

    合并两个 Wav 文件的函数 实例一 unit Unit1; interface usesWindows, Messages, SysUtils, Variants, Classes, Graphic ...

  3. xcode调试查看变量的值

    对于IPhone开发/XCode的初学者,如何在调试时查看变量的值是很头痛的事情.因为Xcode的expression 经常无法正确显示变量的值.但是强大的GDB可以很方便的帮我们查看变量的值. 当执 ...

  4. C#输出到Release VS中Release模式下生成去掉生成pdb文件

    Release 与 Debug 的区别就不多说了, 简单来说 Release 优化过, 性能高一些. Debug 为方便调试. 默认情况下是 Debug, 那如何改成 Release 呢? 项目上右键 ...

  5. JavaScript 检查IP

    //---------------------------------------------------------- // 功能:检查IP // 参数: // strpart ip地址 // 返回 ...

  6. git push origin master:master

    $git push origin master:master (在local repository中找到名字为master的branch,使用它去更新remote repository下名字为mast ...

  7. java.lang.ClassCastException: android.widget.RelativeLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams

    java.lang.ClassCastException: android.widget.RelativeLayout$LayoutParams cannot be cast to android.w ...

  8. Linux学习18-gitlab新建项目提交代码

    前言 gitlab前面已经搭建好了,如果我们想用把代码上传到gitlab仓库上的话,先要新建一个项目仓库.然后本地安装git环境,就可以提交了 root用户 gitlab首次在浏览器上打开web页面, ...

  9. U转串口驱动安装

    在装有Win7 32位系统的台式机上 先卸载旧驱动,再又一次安装. 对设备管理器里的U转串口设备从本地更新驱动.选择下图文件 系统弹出红色提示框(是否安装XXXX驱动),选择安装,随后该设备由无法启动 ...

  10. 关于 java.lang.IllegalStateException: invocation

    由于在 quartz 的 job 中有引用其它 service(这个 service 中又引用了 inv.getRequest() ) ,所以报以上错误了...还没有找到解决办法