所有控制器action的基类yii\base\Action.php

 namespace yii\base;//定义的命名空间

 use Yii //使用的命名空间

 class Action extends Component //继承了组建类
 {
          //定义属性action的id

     public $id;

     public $controller; //定义拥有该action的控制器属性

     public function __construct($id, $controller, $config = [])//构造函数,用于初始化id和controller属性
     {
         $this->id = $id;
         $this->controller = $controller;
         parent::__construct($config);
     }

       //通过调用控制器中的同名方法,
     public function getUniqueId()
     {
         return $this->controller->getUniqueId() . '/' . $this->id;
     }
   //用指定的参数运行此操作
     public function runWithParams($params)
     {
         if (!method_exists($this, 'run')) {//如果类中的run方法是不存在
             throw new InvalidConfigException(get_class($this) . ' must define a "run()" method.');//抛出异常
         }
         $args = $this->controller->bindActionParams($this, $params);//控制器的方法,绑定参数
         Yii::trace('Running action: ' . get_class($this) . '::run()', __METHOD__);//输出trace信息
         if (Yii::$app->requestedParams === null) {  //如果Yii::$app的属性requestedParams(操作请求的参数)为空
             Yii::$app->requestedParams = $args;//该参数的值为上面绑定参数的返回值
         }
         if ($this->beforeRun()) {//beforRun方法,默认返回true,意思为run前
             $result = call_user_func_array([$this, 'run'], $args);//把$args作为参数来调用当前控制器的run方法
             $this->afterRun();//空方法

             return $result;//返回函数的调用结果,如出错,返回false
         } else {
             return null;//否则返回空
         }
     }

     protected function beforeRun()//该方法在run之前执行,调用时重写该方法,如果返回为false,则run方法不执行,runwithparams方法返回空
     {
         return true;
     }

     //该方法在run方法后执行,用于处理后续操作
     protected function afterRun()
     {
     }
 }

component.php组件类

class Component extends Object  //继承了object类
{

    private $_events = [];//私有的events属性

    private $_behaviors;//私有的behaviors属性

public function __get($name)//__get魔术方法,用于返回组组件的属性值
    {
        $getter = 'get' . $name;//通过连字符构建该属性的get方法名
        if (method_exists($this, $getter)) {//如果该方法存在
            // read property, e.g. getName()
            return $this->$getter();//调用该方法获取属性
        } else {
            // behavior property
            $this->ensureBehaviors();//调用ensureBehaviors()方法确定该行为类中定义了该属性
            foreach ($this->_behaviors as $behavior) {
                if ($behavior->canGetProperty($name)) {//如果该行为类可以获取属性
                    return $behavior->$name;//返回该行为类的属性值
                }
            }
        }
        if (method_exists($this, 'set' . $name)) {//如果该属性名的set方法存在抛出异常
            throw new InvalidCallException('Getting write-only property: ' . get_class($this) . '::' . $name);
        } else {//否则抛出异常,未知的属性
            throw new UnknownPropertyException('Getting unknown property: ' . get_class($this) . '::' . $name);
        }
    }

component的__set方法

  public function __set($name, $value)
     {
         $setter = 'set' . $name;//在属性名前面加set构建set方法
         if (method_exists($this, $setter)) {//如果构建的方法存在
             // 调用该方法设置属性值
             $this->$setter($value);

             return;
         } elseif (strncmp($name, 'on ', 3) === 0) {//如果方法不存在,且属性名前三个字符为on+空格
             // on event: attach event handler
             $this->on(trim(substr($name, 3)), $value);//调用on方法将事件处理程序附加到事件

             return;
         } elseif (strncmp($name, 'as ', 3) === 0) {//否则,如果属性名的前三个字符为as+空格
             // as behavior: attach behavior
             $name = trim(substr($name, 3));//截取as后面的字符
             $this->attachBehavior($name, $value instanceof Behavior ? $value : Yii::createObject($value));//嗲用attachBehavior添加一个行为到组件

             return;
         } else {//否则
             // behavior property
             $this->ensureBehaviors();//调用ensureBehaviors()方法确定该行为类中定义了该属性
             foreach ($this->_behaviors as $behavior) {
                 if ($behavior->canSetProperty($name)) {//调用方法判断该属性是否口试被赋值
                     $behavior->$name = $value;//给该行为类的属性赋值

                     return;
                 }
             }
         }
         if (method_exists($this, 'get' . $name)) {//如果该属性的get方法存在,抛出异常
             throw new InvalidCallException('Setting read-only property: ' . get_class($this) . '::' . $name);
         } else {//否则抛出异常,未知的属性
             throw new UnknownPropertyException('Setting unknown property: ' . get_class($this) . '::' . $name);
         }
     }

Yii源码阅读笔记(四)的更多相关文章

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

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

  2. Werkzeug源码阅读笔记(四)

    今天主要讲一下werkzeug中的routing模块.这个模块是werkzeug中的重点模块,Flask中的路由相关的操作使用的都是这个模块 routing模块的用法 在讲解模块的源码之前,先讲讲这个 ...

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

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

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

    Module类中获取子模块,注册子模块,实例化控制器,根据路由运行指定控制器方法的注释: /** * Retrieves the child module of the specified ID. * ...

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

    Model类,集中整个应用的数据和业务逻辑——场景.属性和标签: /** * Returns a list of scenarios and the corresponding active attr ...

  6. Yii源码阅读笔记(二)

    接下来阅读BaseYii.php vendor/yiisoft/yii2/BaseYii.php—— namespace yii; use yii\base\InvalidConfigExceptio ...

  7. Yii源码阅读笔记(八)

    前面阅读了Yii2的两个基本类Object和Component,了解了Yii的三个重要概念属性.事件.行为,下面开始阅读Event类,Event类是所有事件类的基类: <?php /** * @ ...

  8. Yii源码阅读笔记(三)

    接着上次的继续阅读BaseYii.php vendor/yiisoft/yii2/BaseYii.php—— public static function getRootAlias($alias)// ...

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

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

随机推荐

  1. 【转】解决编译Apache出现的问题:configure: error: APR not found . Please read the documentation

    这里写的很清楚了,已验证可用 http://blog.csdn.net/linghao00/article/details/7926458

  2. 被忽视但很实用的那部分SQL

    一.前言 虽然我们大多数人都学习过SQL,但是经常忽略它.总是会自以为学到的已经足够用了,从而导致我们在实际开发的过程中遇到复杂的问题后只能在检索数据后通过传统的代码来完成,但是其中很多的功能利用SQ ...

  3. cocos2dx游戏开发——微信打飞机学习笔记(八)——EnemyLayer的搭建

    一.创建文件= =               EnemyLayer.h               EnemyLayer.cpp Ps:我绝对不是在凑字数~. 二.How to do? (1)一些宏 ...

  4. URI和URL的区别

    这两天在写代码的时候,由于涉及到资源的位置,因此,需要在Java Bean中定义一些字段,用来表示资源的位置,比如:imgUrl,logoUri等等.但是,每次定义的时候,心里都很纠结,是该用imgU ...

  5. android 自定义相机画面倒立解决方案

    有部分手机的影像是倒立的,如何解决这个问题呢? 请看下面 public static void setCameraDisplayOrientation(Activity activity, int c ...

  6. lr_save_var字符串截取总结

    函数作用: 将一个变化长度的字符串保存到parameter中. 用法实例: 此处讲解函数: Action() {     web_save_timestamp_param("tStamp&q ...

  7. JVM的GC理论详解

    GC的概念 GC:Garbage Collection 垃圾收集.这里所谓的垃圾指的是在系统运行过程当中所产生的一些无用的对象,这些对象占据着一定的内存空间,如果长期不被释放,可能导致OOM(堆溢出) ...

  8. Xamarin Android长度单位区别

    Xamarin Android长度单位区别 Android中长度单位有6种:px.in.mm.pt.dp/dip.sp.其中,px表示显示设备的一个像素:in表示显示设备的1英寸:mm表示显示设备的1 ...

  9. 编程第一个Apple Watch程序创建项目

    编程第一个Apple Watch程序创建项目 2.4  编程第一个程序 本节将通过编写第一个程序,为开发者讲解如何添加Watch应用对象.运行程序.界面设计.编写代码等内容本文选自Apple Watc ...

  10. windows下基于sublime text3的nodejs环境搭建

    第一步:先安装sublime text3.详细教程可自行百度,这边不具体介绍了. 第二步.安装nodejs插件,有两种方式 第一种方式:直接下载https://github.com/tanepiper ...