Yii源码阅读笔记(三十)
Widget类是所有小部件的基类,开始,结束和渲染小部件内容的方法的注释:
namespace yii\base; use Yii; use ReflectionClass; /** * Widget is the base class for widgets. * Widget是所有小部件的基类 * * @property string $id ID of the widget. * @property \yii\web\View $view The view object that can be used to render views or view files. Note that the * type of this property differs in getter and setter. See [[getView()]] and [[setView()]] for details. * @property string $viewPath The directory containing the view files for this widget. This property is * read-only. * * @author Qiang Xue <qiang.xue@gmail.com> * @since 2.0 */ class Widget extends Component implements ViewContextInterface { /** * @var integer a counter used to generate [[id]] for widgets. * @var integer 一个用于生成widget ID的计数器 * @internal */ public static $counter = 0; /** * @var string the prefix to the automatically generated widget IDs. * @var string widget IDs自动生成的前缀 * @see getId() */ public static $autoIdPrefix = 'w'; /** * @var Widget[] the widgets that are currently being rendered (not ended). This property * is maintained by [[begin()]] and [[end()]] methods. * @var 目前正在呈现的小部件 * @internal */ public static $stack = []; /** * Begins a widget. * 开始一个小部件 * This method creates an instance of the calling class. It will apply the configuration * to the created instance. A matching [[end()]] call should be called later. * 该方法将应用配置文件创建调用类的实例,有一个[[end()]]方法相对应 * @param array $config name-value pairs that will be used to initialize the object properties * @return static the newly created widget instance */ public static function begin($config = []) { $config['class'] = get_called_class();// get_called_class -- 后期静态绑定("Late Static Binding")类的名称 // 就是用那个类调用的这个方法,就返回那个类,返回值中带有 namespace /* @var $widget Widget */ $widget = Yii::createObject($config);//通过类名和传入的配置,实例化调用类 static::$stack[] = $widget;//将实例放入正在呈现的小部件堆栈中 return $widget;//返回小部件实例 } /** * Ends a widget. * 结束一个小部件 * Note that the rendering result of the widget is directly echoed out. * @return static the widget instance that is ended. * @throws InvalidCallException if [[begin()]] and [[end()]] calls are not properly nested */ public static function end() { if (!empty(static::$stack)) {//正在呈现的小部件堆栈中存在调用类实例 $widget = array_pop(static::$stack);//则从堆栈中删除最后一个实例--调用当前小部件的实例 if (get_class($widget) === get_called_class()) {//如果删除的实例的类名和当前调用类的类名相同 echo $widget->run();//输出小部件的内容 return $widget;//返回调用类实例 } else { throw new InvalidCallException('Expecting end() of ' . get_class($widget) . ', found ' . get_called_class()); } } else {//抛出异常,未找到对应的begin()开始方法 throw new InvalidCallException('Unexpected ' . get_called_class() . '::end() call. A matching begin() is not found.'); } } /** * Creates a widget instance and runs it. * 创建一个widget实例,并运行它 * The widget rendering result is returned by this method. * widget的渲染结果将被该方法返回 * @param array $config name-value pairs that will be used to initialize the object properties * @return string the rendering result of the widget. * @throws \Exception */ public static function widget($config = []) { ob_start();//打开一个输出缓冲区,所有的输出信息不再直接发送到浏览器,而是保存在输出缓冲区里面 ob_implicit_flush(false);//打开或关闭绝对刷新,默认为关闭,打开后ob_implicit_flush(true), //所谓绝对刷新,即当有输出语句(e.g: echo)被执行时,便把输出直接发送到浏览器,而不再需要调用flush()或等到脚本结束时才输出 try { /* @var $widget Widget */ $config['class'] = get_called_class();//获取调用类的类名 $widget = Yii::createObject($config);//实例化调用类 $out = $widget->run();//运行widget } catch (\Exception $e) { // close the output buffer opened above if it has not been closed already if (ob_get_level() > 0) {//返回输出缓冲机制的嵌套级别 ob_end_clean();//删除内部缓冲区的内容,关闭缓冲区(不输出) } throw $e; } return ob_get_clean() . $out;//返回内部缓冲区的内容,关闭缓冲区 }
Yii源码阅读笔记(三十)的更多相关文章
- Yii源码阅读笔记(十八)
View中的查找视图文件方法和渲染文件方法 /** * Finds the view file based on the given view name. * 通过view文件名查找view文件 * ...
- Yii源码阅读笔记(十六)
Model类,集中整个应用的数据和业务逻辑—— /** * Generates a user friendly attribute label based on the give attribute ...
- Yii源码阅读笔记(十五)
Model类,集中整个应用的数据和业务逻辑——验证 /** * Returns the attribute labels. * 返回属性的标签 * * Attribute labels are mai ...
- Yii源码阅读笔记(十四)
Model类,集中整个应用的数据和业务逻辑——场景.属性和标签: /** * Returns a list of scenarios and the corresponding active attr ...
- Yii源码阅读笔记(十二)
Action类,控制器中方法的基类: namespace yii\base; use Yii; /** * Action is the base class for all controller ac ...
- Yii源码阅读笔记(十)
控制器类,所有控制器的基类,用于调用模型和布局,输出到视图 namespace yii\base; use Yii; /** * Controller is the base class for cl ...
- Yii源码阅读笔记(十九)
View中渲染view视图文件的前置和后置方法,以及渲染动态内容的方法: /** * @return string|boolean the view file currently being rend ...
- Yii源码阅读笔记(一)
今天开始阅读yii2的源码,想深入了解一下yii框架的工作原理,同时学习一下优秀的编码规范和风格.在此记录一下阅读中的小心得. 每个框架都有一个入口文件,首先从入口文件开始,yii2的入口文件位于we ...
- Werkzeug源码阅读笔记(三)
这次主要讲下werkzeug中的Local. 源码在werkzeug/local.py Thread Local 在Python中,状态是保存在对象中.Thread Local是一种特殊的对象,它是对 ...
- Yii源码阅读笔记(三十五)
Container,用于动态地创建.注入依赖单元,映射依赖关系等功能,减少了许多代码量,降低代码耦合程度,提高项目的可维护性. namespace yii\di; use ReflectionClas ...
随机推荐
- python写计算器
#!/usr/bin/env python # -*- coding:utf-8 -*- import re def chu(arg1): #定义加减 arg = arg1[0] #beacuse p ...
- SQLPULS : 密码中有特殊字符的处理方法
前日在使用SQLPLUS访问oracle数据库时,系统提示密码过期,需要更新密码.于是不假思索的修改密码为xxx@2016(估计当时脑子抽风了),造成了杯具的开始. 再次进入SQLPLUS,输入用户名 ...
- java2
1:关键字(掌握) (1)被Java语言赋予特定含义的单词 (2)特点: 全部小写. (3)注意事项: A:goto和const作为保留字存在. B:类似于Notepad++这样的高级记事本会对关键字 ...
- ACM/ICPC 之 Dinic算法(POJ2112)
Optimal Milking //二分枚举最大距离的最小值+Floyd找到最短路+Dinic算法 //参考图论算法书,并对BFS构建层次网络算法进行改进 //Time:157Ms Memory:65 ...
- Maven下载依赖项的源代码(source code)和Javadoc
Maven 默认只下载依赖项本身的 jar 文件,不下载源代码和 Javadoc.如此固然工程的体积是最小的,但在开发者不熟悉依赖的对象时,需要查找源代码中的方法定义和说明. 这时我们需要使用一条 M ...
- 51nod1256(乘法逆元)
题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1256 题意:中文题诶~ 思路: M, N 互质, 求满足 K ...
- Swift - 生成随机颜色(Extension UIColor)
在开发中,我们有时需要生成一些随机的颜色.但 UIColor 没有提供方法或属性来直接获取随机颜色,这里对其进行扩展,方便使用. 1,扩展UIColor,增加随机颜色属性 1 2 3 4 5 6 7 ...
- ffmpeg 如何音视频同步
转自:http://blog.csdn.net/yangzhiloveyou/article/details/8832516 output_example.c 中AV同步的代码如下(我的代码有些修改) ...
- 【转】C#中WinForm程序退出方法技巧总结
C#中WinForm程序退出方法技巧总结 一.关闭窗体 在c#中退出WinForm程序包括有很多方法,如:this.Close(); Application.Exit();Application.Ex ...
- Codeforces 307 div2 E.GukiZ and GukiZiana 分块
time limit per test 10 seconds memory limit per test 256 megabytes input standard input output stand ...