zoukankan      html  css  js  c++  java
  • yii2框架随笔26

    继续来看Container.php

    <?php
        /**
         * Registers a class definition with this container.
         * 用这个容器注册一个类定义。
         * If a class definition with the same name already exists, it will be overwritten with the new one.
         * 如果已存在具有相同名称的类的定义,它将被新的覆盖。
         * You may use [[has()]] to check if a class definition already exists.
         * 您可以使用[[has()]]检查一个类定义是否已经存在.
         * @param string $class class name, interface name or alias name
         * @param mixed $definition the definition associated with `$class`. It can be one of the followings:
         * @param array $params the list of constructor parameters. The parameters will be passed to the class
         * constructor when [[get()]] is called.
         * @return static the container itself
         */
        public function set($class, $definition = [], array $params = [])
        {
            // 处理definition,并存入到_definitions中
            $this->_definitions[$class] = $this->normalizeDefinition($class, $definition);
            // 将$params存入_params中
            $this->_params[$class] = $params;
            unset($this->_singletons[$class]);
            return $this;
        }
    
         /**
         * Registers a class definition with this container and marks the class as a singleton class.
         * 用这个容器注册一个类定义,并将该类定义为一个单独的类。
         * This method is similar to [[set()]] except that classes registered via this method will only have one
         * instance. Each time [[get()]] is called, the same instance of the specified class will be returned.
         * 这种方法类似于 [[set()]]除了类注册通过这种方法只有一个实例。每一次[[get()]]之称,指定类的同一实例将返回
         * @param string $class class name, interface name or alias name
         * @param mixed $definition the definition associated with `$class`. See [[set()]] for more details.
         * @param array $params the list of constructor parameters. The parameters will be passed to the class
         * constructor when [[get()]] is called.
         * @return static the container itself
         * @see set()
         */
        public function setSingleton($class, $definition = [], array $params = [])
        {
            // 同上
            $this->_definitions[$class] = $this->normalizeDefinition($class, $definition);
            $this->_params[$class] = $params;
            // 这里是单例,表示这个还会继续用到,所以不用unset,只需赋为空即可
            $this->_singletons[$class] = null;
            return $this;
        }
        /**
         * Returns a value indicating whether the container has the definition of the specified name.
         * 返回一个值,该值指示容器是否具有指定名称的定义。
         * @param string $class class name, interface name or alias name
         * @return boolean whether the container has the definition of the specified name..
         * @see set()
         */
        public function has($class)
        {
            // 判断是否已经定义了某个服务或组件
            return isset($this->_definitions[$class]);
        }
        /**
         * Returns a value indicating whether the given name corresponds to a registered singleton.
         * 返回一个值,该值指示给定的名称是否对应于已注册的单体.
         * @param string $class class name, interface name or alias name
         * @param boolean $checkInstance whether to check if the singleton has been instantiated.
         * @return boolean whether the given name corresponds to a registered singleton. If `$checkInstance` is true,
         * the method should return a value indicating whether the singleton has been instantiated.
         */
        public function hasSingleton($class, $checkInstance = false)
        {
            // 当 $checkInstance === false 时,用于判断是否已经定义了某个服务或组件
            // 当 $checkInstance === true 时,用于判断是否已经有了某人服务或组件的实例
            return $checkInstance ? isset($this->_singletons[$class]) : array_key_exists($class, $this->_singletons);
        }
        /**
         * Removes the definition for the specified name.
         * @param string $class class name, interface name or alias name
         */
        public function clear($class)
        {
            // 清空相应类的definition和singleton
            unset($this->_definitions[$class], $this->_singletons[$class]);
        }
        /**
         * Normalizes the class definition.
         * 将类定义.
         * @param string $class class name
         * @param string|array|callable $definition the class definition
         * @return array the normalized class definition
         * @throws InvalidConfigException if the definition is invalid.
         */
        protected function normalizeDefinition($class, $definition)
        {
            if (empty($definition)) {
                // 定义为空
                return ['class' => $class];
            } elseif (is_string($definition)) {
                // $definition是字符串,就表明它是类名,$class是简称
                return ['class' => $definition];
            } elseif (is_callable($definition, true) || is_object($definition)) {
                // 是个PHP callable或者是个对象,就直接返回
                return $definition;
            } elseif (is_array($definition)) {
                // 是个数组
                if (!isset($definition['class'])) {
                    // 定义中不存在class键,$class必须是带namespace的类名
                    if (strpos($class, '\') !== false) {
                        $definition['class'] = $class;
                    } else {
                        throw new InvalidConfigException("A class definition requires a "class" member.");
                    }
                }
                return $definition;
            } else {
                throw new InvalidConfigException("Unsupported definition type for "$class": " . gettype($definition));
            }
        }
        /**
         * Returns the list of the object definitions or the loaded shared objects.
         * 返回对象定义或加载的共享对象的列表。
         * @return array the list of the object definitions or the loaded shared objects (type or ID => definition or instance).
         */
        public function getDefinitions()
        {
            return $this->_definitions;
        }
  • 相关阅读:
    项目结队开发---NABC分析(成员)
    梦断代码读后感(二)
    梦断代码读后感(一)
    首尾相连的循环数组求其子数组最大值
    子数组求和之大数溢出
    梦断代码读后感——终结
    软件工程结对开发——一维最大子数组求和溢出问题
    结对开发——求环形一维数组最大子数组的和
    结对开发——电梯调度问题需求分析
    软件工程——求二维数组所有子矩阵的和的最大值
  • 原文地址:https://www.cnblogs.com/taokai/p/5470327.html
Copyright © 2011-2022 走看看