• 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;
        }
  • 相关阅读:
    8.SpringMVC参数传递
    9.SpringMVC和json结合传递参数
    20160815命令行进入其他盘
    5.SpringMVC静态文件的访问
    6.SpringMVC注解启用
    7.SpringMVC注解优化
    3.SpringMVC修改配置文件路径和给界面传递数据
    rails
    SVN Merge合并 Patch打补丁
    Windows环境下怎么在文件夹下打开cmd命令行
  • 原文地址:https://www.cnblogs.com/taokai/p/5470327.html
Copyright © 2020-2023  润新知