搜尋
首頁頭條圖解ThinkPHP5框架(三):配置類別Config.php源碼解讀

ThinkPHP5的配置非常重要,将会影响到整个应用的生命周期,TP5中的配置类Config.php,代码非常的简洁。

在教学过程中,发现很多的同学,都不愿意去看框架源码,认为会用就行,其实这种观点是错误的。

如果想快速提高自己的框架开发水平,阅读源码是最快的路径,其实源码没有大家想象的晦涩难懂。

从本课起,我将带着大家一起,慢慢的把ThinkPHP5的主要类的源码快速过一遍。相信学完后,,你会有:【哇,原来如此~~】的感觉!

本课先讲一个配置类Config.php的源码,该类文件位于: thinkphp/library/think/Config.php

一、Config.php类的源代码如下:

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2017 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------

namespace think;

class Config
{
    // 配置参数
    private static $config = [];
    // 参数作用域
    private static $range = &#39;_sys_&#39;;

    // 设定配置参数的作用域
    public static function range($range)
    {
        self::$range = $range;
        if (!isset(self::$config[$range])) {
            self::$config[$range] = [];
        }
    }

    /**
     * 解析配置文件或内容
     * @param string    $config 配置文件路径或内容
     * @param string    $type 配置解析类型
     * @param string    $name 配置名(如设置即表示二级配置)
     * @param string    $range  作用域
     * @return mixed
     */
    public static function parse($config, $type = &#39;&#39;, $name = &#39;&#39;, $range = &#39;&#39;)
    {
        $range = $range ?: self::$range;
        if (empty($type)) {
            $type = pathinfo($config, PATHINFO_EXTENSION);
        }
        $class = false !== strpos($type, &#39;\\&#39;) ? $type : &#39;\\think\\config\\driver\\&#39; . ucwords($type);
        return self::set((new $class())->parse($config), $name, $range);
    }

    /**
     * 加载配置文件(PHP格式)
     * @param string    $file 配置文件名
     * @param string    $name 配置名(如设置即表示二级配置)
     * @param string    $range  作用域
     * @return mixed
     */
    public static function load($file, $name = &#39;&#39;, $range = &#39;&#39;)
    {
        $range = $range ?: self::$range;
        if (!isset(self::$config[$range])) {
            self::$config[$range] = [];
        }
        if (is_file($file)) {
            $name = strtolower($name);
            $type = pathinfo($file, PATHINFO_EXTENSION);
            if (&#39;php&#39; == $type) {
                return self::set(include $file, $name, $range);
            } elseif (&#39;yaml&#39; == $type && function_exists(&#39;yaml_parse_file&#39;)) {
                return self::set(yaml_parse_file($file), $name, $range);
            } else {
                return self::parse($file, $type, $name, $range);
            }
        } else {
            return self::$config[$range];
        }
    }

    /**
     * 检测配置是否存在
     * @param string    $name 配置参数名(支持二级配置 .号分割)
     * @param string    $range  作用域
     * @return bool
     */
    public static function has($name, $range = &#39;&#39;)
    {
        $range = $range ?: self::$range;

        if (!strpos($name, &#39;.&#39;)) {
            return isset(self::$config[$range][strtolower($name)]);
        } else {
            // 二维数组设置和获取支持
            $name = explode(&#39;.&#39;, $name);
            return isset(self::$config[$range][strtolower($name[0])][$name[1]]);
        }
    }

    /**
     * 获取配置参数 为空则获取所有配置
     * @param string    $name 配置参数名(支持二级配置 .号分割)
     * @param string    $range  作用域
     * @return mixed
     */
    public static function get($name = null, $range = &#39;&#39;)
    {
        $range = $range ?: self::$range;
        // 无参数时获取所有
        if (empty($name) && isset(self::$config[$range])) {
            return self::$config[$range];
        }

        if (!strpos($name, &#39;.&#39;)) {
            $name = strtolower($name);
            return isset(self::$config[$range][$name]) ? self::$config[$range][$name] : null;
        } else {
            // 二维数组设置和获取支持
            $name    = explode(&#39;.&#39;, $name);
            $name[0] = strtolower($name[0]);
            return isset(self::$config[$range][$name[0]][$name[1]]) ? self::$config[$range][$name[0]][$name[1]] : null;
        }
    }

    /**
     * 设置配置参数 name为数组则为批量设置
     * @param string|array  $name 配置参数名(支持二级配置 .号分割)
     * @param mixed         $value 配置值
     * @param string        $range  作用域
     * @return mixed
     */
    public static function set($name, $value = null, $range = &#39;&#39;)
    {
        $range = $range ?: self::$range;
        if (!isset(self::$config[$range])) {
            self::$config[$range] = [];
        }
        if (is_string($name)) {
            if (!strpos($name, &#39;.&#39;)) {
                self::$config[$range][strtolower($name)] = $value;
            } else {
                // 二维数组设置和获取支持
                $name                                                 = explode(&#39;.&#39;, $name);
                self::$config[$range][strtolower($name[0])][$name[1]] = $value;
            }
            return;
        } elseif (is_array($name)) {
            // 批量设置
            if (!empty($value)) {
                self::$config[$range][$value] = isset(self::$config[$range][$value]) ?
                array_merge(self::$config[$range][$value], $name) :
                self::$config[$range][$value] = $name;
                return self::$config[$range][$value];
            } else {
                return self::$config[$range] = array_merge(self::$config[$range], array_change_key_case($name));
            }
        } else {
            // 为空直接返回 已有配置
            return self::$config[$range];
        }
    }

    /**
     * 重置配置参数
     */
    public static function reset($range = &#39;&#39;)
    {
        $range = $range ?: self::$range;
        if (true === $range) {
            self::$config = [];
        } else {
            self::$config[$range] = [];
        }
    }
}

二、源代码解读的思维导图:

圖解ThinkPHP5框架(三):配置類別Config.php源碼解讀

三、思维导图文字说明:

配置类Config.php

1 位置:thinkphp/library/think/Config.php

2 属性(2个)

2.1 private static $config = [];

2.1.1 内容:配置参数

2.1.2 访问类型:私有静态,仅限类中静态方法用self::访问

2.1.3 接受值类型:Array数组


2.2 private static $range = '_sys_';

2.2.1 内容:配置参数的作用域

2.2.2 访问类型:私有静态,仅限类中静态方法用self::访问

2.2.3 接受值类型:String字符串


3 方法(7个)

3.1 public static function range($range)

3.1.1 功能:设定配置参数的作用域

3.1.2 访问类型:公共静态,供外部用类名Config::访问

3.1.3 输入参数:$range,string类型,表示配置作用域的字符串

3.1.4 返回结果:给配置作用域属性$rang赋值


3.2 public static function parse($config, $type = '', $name = '', $range = '')

3.2.1 功能:解析配置文件或内容

3.2.2 访问类型:公共静态,供外部用类名Config::访问

3.2.3 输入参数

3.2.3.1 string    $config 配置文件路径或内容

3.2.3.2 string    $type 配置解析类型

3.2.3.3 string    $name 配置名(如设置即表示二级配置)

3.2.3.4 string    $range  作用域

3.2.4 返回结果:mixed 不确定类型或任何类型


3.3 public static function load($file, $name = '', $range = '')

3.3.1 功能:加载配置文件(PHP格式)

3.3.2 访问类型:公共静态,供外部用类名Config::访问

3.3.3 输入参数

3.3.3.1 string    $file 配置文件名

3.3.3.2 string    $name 配置名(如设置即表示二级配置)

3.3.3.3 string    $range  作用域

3.3.4 返回结果:mixed 不确定类型或任何类型


3.4 public static function has($name, $range = '')

3.4.1 功能:检测配置是否存在

3.4.2 访问类型:公共静态,供外部用类名Config::访问

3.4.3 输入参数

3.4.3.1 $name 配置参数名(支持二级配置 .号分割)

3.4.3.2 string    $range  作用域

3.4.4 返回结果:bool布尔类型,存在为true,否则为false


3.5 public static function get($name = null, $range = '')

3.5.1 功能:获取配置参数 为空则获取所有配置

3.5.2 访问类型:公共静态,供外部用类名Config::访问

3.5.3 输入参数

3.5.3.1 string    $name 配置参数名(支持二级配置 .号分割)

3.5.3.2 string    $range  作用域

3.5.4 返回结果:mixed 不确定类型或任何类型


3.6 public static function set($name, $value = null, $range = '')

3.6.1 功能:设置配置参数 name为数组则为批量设置

3.6.2 访问类型:公共静态,供外部用类名Config::访问

3.6.3 输入参数

3.6.3.1 string|array  $name 配置参数名(支持二级配置 .号分割)

3.6.3.2 mixed         $value 配置值

3.6.3.3 string    $range  作用域

3.6.4 返回结果:mixed 不确定类型或任何类型


3.7 public static function reset($range = '')

3.7.1 功能:重置配置参数

3.7.2 访问类型:公共静态,供外部用类名Config::访问

3.7.3 输入参数:string    $range  作用域

3.7.4 返回结果:self::$config=[];//清空配置数组


四、思维导图源文件下载:xmind格式

圖解ThinkPHP5框架(三):配置類別Config.php源碼解讀配置類別Config.zip

【相關推薦】

1. 圖解ThinkPHP5框架(一):基礎知識,開發規範與目錄結構

2. 圖解ThinkPHP5框架(二):應用運行流程與生命週期

3. 2017年最新的10個thinkphp影片教學推薦

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能