Yii源码阅读笔记(三十四)
Instance类, 表示依赖注入容器或服务定位器中对某一个对象的引用
namespace yii\di; use Yii; use yii\base\InvalidConfigException; /** * Instance represents a reference to a named object in a dependency injection (DI) container or a service locator. * Instance 表示依赖注入容器或服务定位器中对某一个对象的引用 * * You may use [[get()]] to obtain the actual object referenced by [[id]]. * 可以通过使用[[get()]]方法和[[id]]获取实际对象的引用 * * Instance is mainly used in two places: * Instance 主要在两个地方被使用: * * - When configuring a dependency injection container, you use Instance to reference a class name, interface name * or alias name. The reference can later be resolved into the actual object by the container. * 在配置“依赖注入容器”时,可以使用Instance引用一个类名称、接口名称或别名。该引用将被容器将解析为实际的对象 * - In classes which use service locator to obtain dependent objects. * 在类中使用服务定位器获取依赖对象时。 * * The following example shows how to configure a DI container with Instance: * * ```php * $container = new \yii\di\Container; * $container->set('cache', 'yii\caching\DbCache', Instance::of('db')); * $container->set('db', [ * 'class' => 'yii\db\Connection', * 'dsn' => 'sqlite:path/to/file.db', * ]); * ``` * * And the following example shows how a class retrieves a component from a service locator: * * ```php * class DbCache extends Cache * { * public $db = 'db'; * * public function init() * { * parent::init(); * $this->db = Instance::ensure($this->db, 'yii\db\Connection'); * } * } * ``` * * @author Qiang Xue <qiang.xue@gmail.com> * @since 2.0 */ class Instance { /** * @var string the component ID, class name, interface name or alias name * @var string 用于保存类名、接口名或者别名 */ public $id; /** * Constructor. * 构造函数,仅将传入的ID赋值给 $id 属性 * @param string $id the component ID */ protected function __construct($id) { $this->id = $id; } /** * Creates a new Instance object. * 静态方法创建一个Instance实例 * @param string $id the component ID * @return Instance the new Instance object. */ public static function of($id) { return new static($id);//实例化访问该方法的类 } /** * Resolves the specified reference into the actual object and makes sure it is of the specified type. * 静态方法,用于将引用解析成实际的对象,并确保这个对象的类型 * * The reference may be specified as a string or an Instance object. If the former, * it will be treated as a component ID, a class/interface name or an alias, depending on the container type. * * If you do not specify a container, the method will first try `Yii::$app` followed by `Yii::$container`. * * For example, * * ```php * use yii\db\Connection; * * // returns Yii::$app->db * $db = Instance::ensure('db', Connection::className()); * // returns an instance of Connection using the given configuration * $db = Instance::ensure(['dsn' => 'sqlite:path/to/my.db'], Connection::className()); * ``` * * @param object|string|array|static $reference an object or a reference to the desired object. * You may specify a reference in terms of a component ID or an Instance object. * Starting from version 2.0.2, you may also pass in a configuration array for creating the object. * If the "class" value is not specified in the configuration array, it will use the value of `$type`. * @param string $type the class/interface name to be checked. If null, type check will not be performed. * @param ServiceLocator|Container $container the container. This will be passed to [[get()]]. * @return object the object referenced by the Instance, or `$reference` itself if it is an object. * @throws InvalidConfigException if the reference is invalid */ public static function ensure($reference, $type = null, $container = null) { if (is_array($reference)) {//如果$reference是数组 $class = isset($reference['class']) ? $reference['class'] : $type;//$reference中有类名,则将类名赋值给$class,否则将$type赋值给$class if (!$container instanceof Container) {//如果$container不是Container的实例 $container = Yii::$container;//则取Yii中定义的Container对象 } unset($reference['class']); return $container->get($class, [], $reference);//返回引用的实例 } elseif (empty($reference)) {//如果$reference为空,则抛出异常 throw new InvalidConfigException('The required component is not specified.'); } if (is_string($reference)) {//如果$reference是字符串 $reference = new static($reference);//则实例化该引用类 } elseif ($type === null || $reference instanceof $type) {//如果给定检查的类为空或者$reference是给定检查的类的实例 return $reference;//返回该实例 } if ($reference instanceof self) {//如果$reference是Istance的实例 $component = $reference->get($container);//则获取调用$container的组件的对象 if ($type === null || $component instanceof $type) {//如果给定检查的类为空或者$component是给定检查的类的实例 return $component;//返回$component } else {//否则抛出异常 跟预期的类型不符合 throw new InvalidConfigException('"' . $reference->id . '" refers to a ' . get_class($component) . " component. $type is expected."); } } $valueType = is_object($reference) ? get_class($reference) : gettype($reference); throw new InvalidConfigException("Invalid data type: $valueType. $type is expected."); } /** * Returns the actual object referenced by this Instance object. * 获取这个实例所引用的实际对象,它调用的是yii\di\Container::get()来获取实际对象 * @param ServiceLocator|Container $container the container used to locate the referenced object. * If null, the method will first try `Yii::$app` then `Yii::$container`. * @return object the actual object referenced by this Instance object. */ public function get($container = null) { if ($container) { return $container->get($this->id);//如果传入$container容器,则调用$container中的get方法获取引用的实际对象 } if (Yii::$app && Yii::$app->has($this->id)) {//如果该对象已有实例 return Yii::$app->get($this->id);//返回该实例 } else { return Yii::$container->get($this->id);//否则调用yii\di\Container::get()来获取实际对象 } } }
Yii源码阅读笔记(三十四)的更多相关文章
- Yii源码阅读笔记(十四)
Model类,集中整个应用的数据和业务逻辑——场景.属性和标签: /** * Returns a list of scenarios and the corresponding active attr ...
- 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源码阅读笔记(十二)
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 ...
- Yii源码阅读笔记(二)
接下来阅读BaseYii.php vendor/yiisoft/yii2/BaseYii.php—— namespace yii; use yii\base\InvalidConfigExceptio ...
- Werkzeug源码阅读笔记(三)
这次主要讲下werkzeug中的Local. 源码在werkzeug/local.py Thread Local 在Python中,状态是保存在对象中.Thread Local是一种特殊的对象,它是对 ...
随机推荐
- ios 抓取真机的网络包
一直被如何从真机上抓包所困扰!今天偶然看到了最简单有效的方法!分享一下: 原地址链接 http://blog.csdn.net/phunxm/article/details/38590561 通过 R ...
- 20.SqlServer中if跟循环语句
--if语句declare @i int begin print @i end else --循环语句 declare @i int begin insert into grade(classname ...
- SQL中inner join、outer join和cross join的区别
对于SQL中inner join.outer join和cross join的区别简介:现有两张表,Table A 是左边的表.Table B 是右边的表.其各有四条记录,其中有两条记录name是相同 ...
- Rest(表述性状态转移)
本文的主要内容有: 1.了解Rest 2.了解RESTful WebService 3.使用SpringMvc实现RESTful ------------------------------我是华丽的 ...
- Win32中TreeView控件的使用方法,类似于资源管理器中文件树形显示方式
首先是头文件,内容如下: #include <tchar.h> #include "..\CommonFiles\CmnHdr.h" #include <Wind ...
- 【Java EE 学习 51】【Spring学习第三天】【cglib动态代理】【AOP和动态代理】【切入点表达式】
一.cglib动态代理 1.简介 (1)CGlib是一个强大的,高性能,高质量的Code生成类库.它可以在运行期扩展Java类与实现Java接口. (2) 用CGlib生成代理类是目标类的子类. (3 ...
- php多文件上传
多文件上传<input type="file" name="file[]" multiple /> <?php function reArra ...
- 高并发应用场景下的负载均衡与故障转移实践,AgileEAS.NET SOA 负载均衡介绍与实践
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
- C语言中的强符号与弱符号
转自:http://blog.csdn.net/astrotycoon/article/details/8008629 一.概述 在C语言中,函数和初始化的全局变量(包括显示初始化为0)是强符号,未初 ...
- JS 之Blob 对象类型
原文 http://blog.csdn.net/oscar999/article/details/36373183 什么是Blob? Blob 是什么? 这里说的是一种Javascript的对象类型. ...