TP5.1 框架解析(二):配置文件

一、框架默认配置文件

  1. 惯例配置
    1. 核心框架内置的配置文件,无需更改。
    2. tp/thinkphp/convention.php
  2. 应用配置
    1. 每个应用(项目)的全局配置文件(项目根目录下的 config 目录下的文件)
  3. 模块配置
    1. 每个模块下的配置(相同的配置参数会覆盖 应用配置
  4. 动态配置
    1. 不建议使用

二、阅读前需掌握知识点

2.1 ArrayAccess 接口

提供像访问数组一样,访问对象的能力的接口

interface ArrayAccess {
    // 检查偏移位置是否存在
    public function offsetExists($offset);
    // 获取一个偏移位置的值
    public function offsetGet($offset);
    // 设置一个偏移位置的值
    public function offsetSet($offset, $value);
    // 删除一个偏移位置的值
    public function offsetUnset($offset);
}

2.2 Yaconf

Yaconf – 一个高性能的配置管理扩展
GtiHub

# vim /etc/php.ini

; Yaconf
extension=yaconf.so
yaconf.directory=/data/vagrant/tp51/yaconf
yaconf.check_delay=3600

三、分析 Config 类

3.1 tp/public/index.php

我们看到 Container::get('app')->run() 方法,这是利用了 容器 ,实际执行的是 tp/thinkphp/library/think/App.php 文件中的 public function run() 方法。

.
// 执行应用并响应\
Container::get('app')->run()->send();
.

3.2 tp/thinkphp/library/think/App.php

3.2.1 执行应用程序 run

file

3.2.2 初始化应用 initialize

thinkphp 默认的配置文件位置为:tp/thinkphp/convention.php

public function initialize(){
.
.
.
    // 1、环境变量 = 加载环境变量配置文件
    if (is_file($this->rootPath . '.env')) {
      $this->env->load($this->rootPath . '.env');
    }

    $this->configExt = $this->env->get('config_ext', '.php');

    // 2、tp 默认配置 = 加载惯例配置文件
    $this->config->set(include $this->thinkPath . 'convention.php');

    // 设置路径环境变量
    .
    .
    .

    // 3、继续跟踪 = 初始化应用
    $this->init();
.
.
.
}

3.2.3 初始化应用 init

file

3.3 tp/thinkphp/library/think/Config.php

3.3.1 加载配置文件 load

file

3.3.2 加载文件 loadFile

file

我们先分析 $this->parse() 方法,然后再回过头来去分析 $this->set() 方法。

3.3.3 解析配置文件 parse

这里利用了 工厂函数,去解析对应的配置文件。

file

好了,现在我们回过头去看 3.3.2 中所使用的 $this->set() 方法

3.3.4 设置配置参数 set

file

四、分析Config类中 get 方法

/**
 * 获取配置参数 为空则获取所有配置
 * @access public
 * @param  string    $name      配置参数名(支持多级配置 .号分割)
 * @param  mixed     $default   默认值
 * @return mixed
 */
public function get($name = null, $default = null)
{
    // 1、默认访问的是 `app` 下的配置,即:app.xxx
    if ($name && false === strpos($name, '.')) {
        $name = $this->prefix . '.' . $name;
    }

    // 2、无参数时获取所有配置,例:""
    if (empty($name)) {
        return $this->config;
    }

    // 3、当参数以 `.` 结尾,则返回这一级下的所有配置,例:app.
    if ('.' == substr($name, -1)) {
        return $this->pull(substr($name, 0, -1));
    }

    if ($this->yaconf) {
        $yaconfName = $this->getYaconfName($name);

        if (Yaconf::has($yaconfName)) {
            return Yaconf::get($yaconfName);
        }
    }

    $name    = explode('.', $name);
    $name[0] = strtolower($name[0]);
    $config  = $this->config;

    // 4、常规访问,例:app.app_name
    // 按.拆分成多维数组进行判断
    foreach ($name as $val) {
        if (isset($config[$val])) {
            $config = $config[$val];
        } else {
            return $default;
        }
    }

    return $config;
}
讨论数量: 0

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!