Yii源码阅读笔记(四)
所有控制器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源码阅读笔记(四)的更多相关文章
- Yii源码阅读笔记(一)
今天开始阅读yii2的源码,想深入了解一下yii框架的工作原理,同时学习一下优秀的编码规范和风格.在此记录一下阅读中的小心得. 每个框架都有一个入口文件,首先从入口文件开始,yii2的入口文件位于we ...
- Werkzeug源码阅读笔记(四)
今天主要讲一下werkzeug中的routing模块.这个模块是werkzeug中的重点模块,Flask中的路由相关的操作使用的都是这个模块 routing模块的用法 在讲解模块的源码之前,先讲讲这个 ...
- Yii源码阅读笔记(三十四)
Instance类, 表示依赖注入容器或服务定位器中对某一个对象的引用 namespace yii\di; use Yii; use yii\base\InvalidConfigException; ...
- Yii源码阅读笔记(二十四)
Module类中获取子模块,注册子模块,实例化控制器,根据路由运行指定控制器方法的注释: /** * Retrieves the child module of the specified ID. * ...
- Yii源码阅读笔记(十四)
Model类,集中整个应用的数据和业务逻辑——场景.属性和标签: /** * Returns a list of scenarios and the corresponding active attr ...
- Yii源码阅读笔记(二)
接下来阅读BaseYii.php vendor/yiisoft/yii2/BaseYii.php—— namespace yii; use yii\base\InvalidConfigExceptio ...
- Yii源码阅读笔记(八)
前面阅读了Yii2的两个基本类Object和Component,了解了Yii的三个重要概念属性.事件.行为,下面开始阅读Event类,Event类是所有事件类的基类: <?php /** * @ ...
- Yii源码阅读笔记(三)
接着上次的继续阅读BaseYii.php vendor/yiisoft/yii2/BaseYii.php—— public static function getRootAlias($alias)// ...
- Yii源码阅读笔记(三十五)
Container,用于动态地创建.注入依赖单元,映射依赖关系等功能,减少了许多代码量,降低代码耦合程度,提高项目的可维护性. namespace yii\di; use ReflectionClas ...
随机推荐
- LeetCode之Balanced Binary Tree 平衡二叉树
判定一棵二叉树是不是二叉平衡树. 链接:https://oj.leetcode.com/problems/balanced-binary-tree/ 题目描述: Given a binary tree ...
- Vim折叠模式设置
参考文章:http://www.cnblogs.com/welkinwalker/archive/2011/05/30/2063587.html set foldmethod=indent " ...
- 拼接JSONStringer出现的不正确的情况。
错误现象: 错误分析及其解答: JSONStringer可以直接嵌套JSONArray,JSONArray可以作为JSONStringer的值.我错误的原因是本质是:JSONArray存放的是JSON ...
- eclipse常用快捷键,这个只要新学会的常用的会陆续更新的。
1.Ctrl+Shift+O 引用包 2.Ctrl+Shift+F 格式化代码 3.Ctrl + / 注释和解除注释代码 4.Ctrl+M 代码最大最小化 5.ctrl+shif ...
- Hark的数据结构与算法练习之耐心排序
算法说明 耐心排序是插入排序的一种,至少wikipedia是这么分的. 话说我明白这个算法的实现思路了,但是不明白这么做的意义何在? 如果明白的朋友帮忙留个言说一下,以后如果我明白的话,我会来修改这个 ...
- LoadRunner中web_custom_request 和 web_submit_data的差别
- LoadRunner11支持的浏览器小结
LoadRunner11录制脚本时不能打开IE浏览器,解决方案有以下几个步骤: l LoadRunner11支持的浏览器版本最高是ie9,把浏览器版本换成ie9; l 打开IE选项----高级—去 ...
- org.springframework.beans包
beans包中最核心的两个类:DefaultListableBeanFactory&XmlBeanDefinitionReader DefaultListableBeanFactory Xml ...
- Count the string[HDU3336]
Count the string Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 今年暑假不AC[HDU2037]
今年暑假不AC Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...