Yii源码阅读笔记(九)
Behvaior类,Behavior类是所有事件类的基类:
namespace yii\base; /** * Behavior is the base class for all behavior classes. * 所有行为的基类 * A behavior can be used to enhance the functionality of an existing component without modifying its code. * In particular, it can "inject" its own methods and properties into the component * and make them directly accessible via the component. It can also respond to the events triggered in the component * and thus intercept the normal code execution. * * @author Qiang Xue <qiang.xue@gmail.com> * @since 2.0 */ class Behavior extends Object { /** * @var 行为的依附对象 */ public $owner; /** * Declares event handlers for the [[owner]]'s events. * 表示这个行为将对类的何种事件进行何种反馈即可 * * Child classes may override this method to declare what PHP callbacks should * be attached to the events of the [[owner]] component. * * The callbacks will be attached to the [[owner]]'s events when the behavior is * attached to the owner; and they will be detached from the events when * the behavior is detached from the component. * * The callbacks can be any of the following: * 事件handler可以是以下形式: * * - method in this behavior: `'handleClick'`, equivalent to `[$this, 'handleClick']` * 字符串,表示行为类的方法,和事件不同,事件总的字符串形式表示全局函数,这里表示当前行为类的方法 * - object method: `[$object, 'handleClick']` * 一个对象或类的成员函数,以数组的形式 * - static method: `['Page', 'handleClick']` * - anonymous function: `function ($event) { ... }` * 一个匿名函数 * * The following is an example: * * ```php * [ * Model::EVENT_BEFORE_VALIDATE => 'myBeforeValidate', * Model::EVENT_AFTER_VALIDATE => 'myAfterValidate', * ] * ``` * * @return 行为所有要响应的事件. */ public function events() { return []; } /** * Attaches the behavior object to the component. * 绑定行为到组件 * The default implementation will set the [[owner]] property * and attach event handlers as declared in [[events]]. * 该方法会默认设置[[owner]]属性,且添加事件处理程序绑定到组件 * Make sure you call the parent implementation if you override this method. * @param Component $owner the component that this behavior is to be attached to. */ public function attach($owner) { $this->owner = $owner;//设置行为的 $owner ,使得行为可以访问、操作所依附的对象 foreach ($this->events() as $event => $handler) {//遍历行为中的 events() 返回的数组 //将准备响应的事件,通过所依附类的 on() 绑定到类上 $owner->on($event, is_string($handler) ? [$this, $handler] : $handler);//这里判断了事件是否是字符串的形式,如果是字符串,表示当前行为类的方法,用$this对象的形式添加 } } /** * Detaches the behavior object from the component. * 解除行为的绑定 * The default implementation will unset the [[owner]] property * 默认将 owner 属性设置为 null ,且解除绑定到类的处理程序 * and detach event handlers declared in [[events]]. * * Make sure you call the parent implementation if you override this method. */ public function detach() { if ($this->owner) { foreach ($this->events() as $event => $handler) {//遍历行为中的 events() 返回的数组 //通过Component的 off() 将绑定到类上的事件hanlder解除下来 $this->owner->off($event, is_string($handler) ? [$this, $handler] : $handler); } $this->owner = null;//将 $owner 设置为 null ,表示这个行为没有依附到任何类上 } } }
Request.php用于获取用户请求:
namespace yii\base; use Yii; /** * Request represents a request that is handled by an [[Application]]. * * @property boolean $isConsoleRequest The value indicating whether the current request is made via console. * @property string $scriptFile Entry script file path (processed w/ realpath()). * * @author Qiang Xue <qiang.xue@gmail.com> * @since 2.0 */ abstract class Request extends Component { // 属性scriptFile,用于表示入口脚本 private $_scriptFile; // 属性isConsoleRequest,用于表示是否是命令行应用 private $_isConsoleRequest; /** * Resolves the current request into a route and the associated parameters. * 抽象函数,要求子类来实现 这个函数的功能主要是为了把Request解析成路由和相应的参数 * @return array the first element is the route, and the second is the associated parameters. */ abstract public function resolve(); /** * Returns a value indicating whether the current request is made via command line * isConsoleRequest属性的getter函数 使用 PHP_SAPI 常量判断当前应用是否是命令行应用 * @return boolean the value indicating whether the current request is made via console */ public function getIsConsoleRequest() { // PHP_SAPI --判断解析php服务是由那种服务器软件,是采用那种协议 return $this->_isConsoleRequest !== null ? $this->_isConsoleRequest : PHP_SAPI === 'cli'; } /** * Sets the value indicating whether the current request is made via command line * isConsoleRequest属性的setter函数 用来设置是否是命令行应用 * @param boolean $value the value indicating whether the current request is made via command line */ public function setIsConsoleRequest($value) { $this->_isConsoleRequest = $value; } /** * Returns entry script file path. * scriptFile属性的getter函数 通过 $_SERVER['SCRIPT_FILENAME'] 来获取入口脚本名 * @return string entry script file path (processed w/ realpath()) * @throws InvalidConfigException if the entry script file path cannot be determined automatically. */ public function getScriptFile() { if ($this->_scriptFile === null) { if (isset($_SERVER['SCRIPT_FILENAME'])) { $this->setScriptFile($_SERVER['SCRIPT_FILENAME']); } else { throw new InvalidConfigException('Unable to determine the entry script file path.'); } } return $this->_scriptFile; } /** * Sets the entry script file path. * scriptFile属性的setter函数,用于设置入口脚本 * The entry script file path can normally be determined based on the `SCRIPT_FILENAME` SERVER variable. * However, for some server configurations, this may not be correct or feasible. * This setter is provided so that the entry script file path can be manually specified. * @param string $value the entry script file path. This can be either a file path or a path alias. * @throws InvalidConfigException if the provided entry script file path is invalid. */ public function setScriptFile($value) { $scriptFile = realpath(Yii::getAlias($value)); if ($scriptFile !== false && is_file($scriptFile)) { $this->_scriptFile = $scriptFile; } else { throw new InvalidConfigException('Unable to determine the entry script file path.'); } } }
Yii源码阅读笔记(九)的更多相关文章
- Yii源码阅读笔记(一)
今天开始阅读yii2的源码,想深入了解一下yii框架的工作原理,同时学习一下优秀的编码规范和风格.在此记录一下阅读中的小心得. 每个框架都有一个入口文件,首先从入口文件开始,yii2的入口文件位于we ...
- Yii源码阅读笔记(二十九)
动态模型DynamicModel类,用于实现模型内数据验证: namespace yii\base; use yii\validators\Validator; /** * DynamicModel ...
- Yii源码阅读笔记(十九)
View中渲染view视图文件的前置和后置方法,以及渲染动态内容的方法: /** * @return string|boolean the view file currently being rend ...
- Yii源码阅读笔记(八)
前面阅读了Yii2的两个基本类Object和Component,了解了Yii的三个重要概念属性.事件.行为,下面开始阅读Event类,Event类是所有事件类的基类: <?php /** * @ ...
- Yii源码阅读笔记(三)
接着上次的继续阅读BaseYii.php vendor/yiisoft/yii2/BaseYii.php—— public static function getRootAlias($alias)// ...
- Yii源码阅读笔记(二)
接下来阅读BaseYii.php vendor/yiisoft/yii2/BaseYii.php—— namespace yii; use yii\base\InvalidConfigExceptio ...
- 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 ...
随机推荐
- 百万用户时尚分享网站feed系统扩展实践
Fashiolista是一个在线的时尚交流网站,用户可以在上面建立自己的档案,和他人分享自己的以及在浏览网页时看到的时尚物品.目前,Fashiolista的用户来自于全球100多个国家,用户达百万级, ...
- SQL语句优化原则
处理百万级以上的数据提高查询速度的方法: .应尽量避免在 .对查询进行优化,应尽量避免全表扫描,首先应考虑在 .应尽量避免在 .应尽量避免在 or num= 可以这样查询: ...
- Web service project中导入的库JAXB(JDK1.7新产品,组成部分)
JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实例文档反向 ...
- 建模算法(十)——灰色理论之关联度分析
一.数据变换技术 为了保证建模的质量和系统分析结果的准确性,对原始的数据要进行去量纲处理. 1.定义 设有序列,则成映射为序列x到序列y的数据变换. (1) f 是初值化变换. (2) f 是均值化变 ...
- jmeter性能测试实战-web登录测试
一.项目背景: 网站信息: 操作系统类型 二.需求: 登录并发测试 三.场景: 1s增加两个线程,运行2000次 分别看20.40.60并发下的表现 四.监控: 成功率.响应时间.标准差.cpu.me ...
- 原生JS代码实现一个Ajax异步请求
异步加载的方式 (1) defer,只支持IE (2) async: (3) 创建script,插入到DOM中,加载完毕后callBack 实现ajax之前必须要创建一个 XMLHttpRequest ...
- LightOJ1417 Forwarding Emails(强连通分量+缩点+记忆化搜索)
题目大概是,每个人收到信息后会把信息发给他认识的一个人如此下去,问一开始要把信息发送给谁这样看到信息的人数最多. 首先找出图中的SCC并记录每个SCC里面的点数,如果传到一个SCC,那么里面的人都可以 ...
- Week,Month, Year 日期区间辅助类
我们在做一些业务系统的时候,经常会用到一些获取时间段的情况.比如要统计某一周.某月.某年 这样一些时间区间内的一些业务数据.这时候我们就需要获取当前时间段内的一些起止日期.这里分享一个通用的日期辅助类 ...
- HTMl5/CSS3/Javascript 学习推荐资源
HTMl5/CSS3/Javascript 学习推荐资源 前端的定义应该是数据内容的展示,在国内大家都觉得前端只是HTML+CSS+Javascript,但是实际上与展示有关的都是前端,所以Ruby/ ...
- 移动端JS 触摸事件基础
一.手机上的触摸事件 基本事件: touchstart //手指刚接触屏幕时触发 touchmove //手指在屏幕上移动时触发 touchend //手指从屏幕上移开时触发 ...