• yii2框架随笔23


    今天继续阅读BaseYii.php

    <?php
      /**
         * Class autoload loader.
         * 自动装载类加载程序。
         * This method is invoked automatically when PHP sees an unknown class.
         * PHP用该方法自动调用一个未知类。
         * The method will attempt to include the class file according to the following procedure:
         * 方法将根据下列程序尝试包括类文件:
         * 1. Search in [[classMap]];
         * 2. If the class is namespaced (e.g. `yiiaseComponent`), it will attempt
         *    to include the file associated with the corresponding path alias
         *    (e.g. `@yii/base/Component.php`);
         * 如果类名称空间(如。yiiaseComponent),它将尝试包括文件与相应的路径别名(如。“@yii/base/Component.php ');
    
         * Example: When aliases `@yii` and `@yii/bootstrap` are defined, classes in the `yiiootstrap` namespace
         * will be loaded using the `@yii/bootstrap` alias which points to the directory where bootstrap extension
         * files are installed and all classes from other `yii` namespaces will be loaded from the yii framework directory.
         * 例子:当别名“@yii”和“@yii /引导”定义,yii 引导的名称空间中的类将加载使用“@yii /引导”别名指向的目录引导扩展
         * 文件安装和所有其他类从“yii”名称空间将从yii加载框架目录。
         * Also the [guide section on autoloading](guide:concept-autoloading).
         *
         * @param string $className the fully qualified class name without a leading backslash ""
         * @throws UnknownClassException if the class does not exist in the class file
         */
        public static function autoload($className)
        {
            // 自动加载类
            if (isset(static::$classMap[$className])) {
                // 如果 $classMap 中存在该类,就直接使用
                $classFile = static::$classMap[$className];
                // 如果第一个字符串为'@',就意味着对应的文件地址是别名,就将它转化成真实的文件地址
                if ($classFile[0] === '@') {
                    $classFile = static::getAlias($classFile);
                }
            } elseif (strpos($className, '\') !== false) {
                // 如果存在'\',就意味着含有 namespace,可以拼成别名,再根据别名获取真实的文件地址
                $classFile = static::getAlias('@' . str_replace('\', '/', $className) . '.php', false);
                // 没取到真是文件地址或者获取的地址不是一个文件,就返回空
                if ($classFile === false || !is_file($classFile)) {
                    return;
                }
            } else {
                return;
            }
            // 引入该类的文件
            include($classFile);
            // 如果是调试模式,而且 $className 即不是类,不是接口,也不是 trait,就抛出异常
            if (YII_DEBUG && !class_exists($className, false) && !interface_exists($className, false) && !trait_exists($className, false)) {
                throw new UnknownClassException("Unable to find '$className' in file: $classFile. Namespace missing?");
            }
        }
        /**
         * Creates a new object using the given configuration.
         * 使用给定的配置创建一个新的对象。
         * You may view this method as an enhanced version of the `new` operator.
         * 你可能会认为这种方法是一个增强版的“新”操作符。
         * The method supports creating an object based on a class name, a configuration array or
         * an anonymous function.
         * 该方法支持基于类名创建一个对象,数组或配置
         * 一个匿名函数。
         *
         * Below are some usage examples:
         * 以下是一些使用例子:
         *
         * ```php
         * // create an object using a class name
         * $object = Yii::createObject('yiidbConnection');
         *
         * // create an object using a configuration array
         * $object = Yii::createObject([
         *     'class' => 'yiidbConnection',
         *     'dsn' => 'mysql:host=127.0.0.1;dbname=demo',
         *     'username' => 'root',
         *     'password' => '',
         *     'charset' => 'utf8',
         * ]);
         *
         *
         * @param string|array|callable $type the object type. This can be specified in one of the following forms:
         * @param array $params the constructor parameters
         * @return object the created object
         * @throws InvalidConfigException if the configuration is invalid.
         * @see yiidiContainer
         */
        public static function createObject($type, array $params = [])
        {
            if (is_string($type)) {
                // 如果是一个字符串,就代表是类的名称,如:yiiwebErrorHandler
                return static::$container->get($type, $params);
            } elseif (is_array($type) && isset($type['class'])) {
                // 是个数组,其中的$type['class']代表类的名称
                $class = $type['class'];
                unset($type['class']);
                return static::$container->get($class, $params, $type);
            } elseif (is_callable($type, true)) {
                // 是个PHP callable,那就调用它,并将其返回值作为服务或组件的实例返回
                return call_user_func($type, $params);
            } elseif (is_array($type)) {
                throw new InvalidConfigException('Object configuration must be an array containing a "class" element.');
            } else {
                throw new InvalidConfigException("Unsupported configuration type: " . gettype($type));
            }
        }
    
            /**
         * Configures an object with the initial property values.
         *
         * 配置初始化一个Object,为该对象属性赋值
         *
         * @param object $object the object to be configured
         * @param array $properties the property initial values given in terms of name-value pairs.
         * @return object the object itself
         */
        public static function configure($object, $properties)
        {
            // 遍历配置里面的内容,一一赋值到相应的属性上
            foreach ($properties as $name => $value) {
                $object->$name = $value;
            }
            return $object;
        }
  • 相关阅读:
    C语言小项目-基于TCP协议和SOCKET编程的网络通信系统
    c语言小项目-使用mysql数据库的图书管理系统
    常用功能函数-密码登陆函数
    C++小项目-吃豆子游戏
    C语言小项目-火车票订票系统
    使用单向链表保存大量数据的基础程序框架
    Oracle创建用户并赋予权限
    Fibonacci sequence 求余数
    sizeof运算符来获取各种数据类型在内存中所占字节数--gyy整理
    C++不同进制整数
  • 原文地址:https://www.cnblogs.com/taokai/p/5459994.html
Copyright © 2020-2023  润新知