tp5.1 配置文件分析 (二)

一、 学习内容

    1、 Array Access 学习笔记 。

    2、Yaconf 高性能配置 学习。

2、配置加载流程图 

tp5.1 配置文件分析 (二)_第1张图片

3、config 类库分析

tp5.1 配置文件分析 (二)_第2张图片

 

1、在 index.php 入口文件中 有个 run 方法

 // 初始化应用
 $this->init();

2、在 run 方法中有个 初始化方法 initizlize方法

// 初始化应用
$this->initialize();

3、在 initizlize 方法中有个 

 // 初始化应用
 $this->init();

4、加载配置文件代码(会加载Config 文件夹中的所有配置文件)

 // 自动读取配置文件
            if (is_dir($path . 'config')) {
                $dir = $path . 'config' . DIRECTORY_SEPARATOR;
            } elseif (is_dir($this->configPath . $module)) {
                $dir = $this->configPath . $module;
            }

            $files = isset($dir) ? scandir($dir) : [];

            foreach ($files as $file) {
                if ('.' . pathinfo($file, PATHINFO_EXTENSION) === $this->configExt) {
                    $this->config->load($dir . $file, pathinfo($file, PATHINFO_FILENAME));
                }
            }

5、load 方法

 

    /**
     * 加载配置文件(多种格式)
     * @access public
     * @param  string    $file 配置文件名
     * @param  string    $name 一级配置名
     * @return mixed
     */
    public function load($file, $name = '')
    {
        if (is_file($file)) {
            $filename = $file;
        } elseif (is_file($this->path . $file . $this->ext)) {
            $filename = $this->path . $file . $this->ext;
        }

        if (isset($filename)) {
            return $this->loadFile($filename, $name);
        } elseif ($this->yaconf && Yaconf::has($file)) {
            return $this->set(Yaconf::get($file), $name);
        }

        return $this->config;
    }

6、loadFile 方法

    protected function loadFile($file, $name)
    {
        $name = strtolower($name);
        $type = pathinfo($file, PATHINFO_EXTENSION);

        if ('php' == $type) {
            return $this->set(include $file, $name);
        } elseif ('yaml' == $type && function_exists('yaml_parse_file')) {
            return $this->set(yaml_parse_file($file), $name);
        }

        return $this->parse($file, $type, $name);
    }

7、这里用了 parse 方法(工厂方法)   

    /**
     * 解析配置文件或内容
     * @access public
     * @param  string    $config 配置文件路径或内容
     * @param  string    $type 配置解析类型
     * @param  string    $name 配置名(如设置即表示二级配置)
     * @return mixed
     */
    public function parse($config, $type = '', $name = '')
    {
        if (empty($type)) {
            $type = pathinfo($config, PATHINFO_EXTENSION);
        }

        $object = Loader::factory($type, '\\think\\config\\driver\\', $config);

        return $this->set($object->parse(), $name);
    }

  对应的是 在 thinkphp\library\think\config\dirver中的 不同的配置加载 (Ini、Json、Xml)

tp5.1 配置文件分析 (二)_第3张图片

 

   在 这些文件中 统一的有一个 parse 方法去加载响应的配置文件,在通过 set 方法设置配置信息。

return $this->set($object->parse(), $name);
    /**
     * 设置配置参数 name为数组则为批量设置
     * @access public
     * @param  string|array  $name 配置参数名(支持三级配置 .号分割)
     * @param  mixed         $value 配置值
     * @return mixed
     */
    public function set($name, $value = null)
    {
        if (is_string($name)) {
            if (false === strpos($name, '.')) {
                $name = $this->prefix . '.' . $name;
            }

            $name = explode('.', $name, 3);

            if (count($name) == 2) {
                $this->config[strtolower($name[0])][$name[1]] = $value;
            } else {
                $this->config[strtolower($name[0])][$name[1]][$name[2]] = $value;
            }

            return $value;
        } elseif (is_array($name)) {
            // 批量设置
            if (!empty($value)) {
                if (isset($this->config[$value])) {
                    $result = array_merge($this->config[$value], $name);
                } else {
                    $result = $name;
                }
                // $this->config[app] = array('sx');
                $this->config[$value] = $result;
            } else {
                $result = $this->config = array_merge($this->config, $name);
            }
        } else {
            // 为空直接返回 已有配置
            $result = $this->config;
        }

        return $result;
    }

 

你可能感兴趣的:(thinkphp,php笔记,tp5框架源码分析)