[李景山php]每天TP5-20161210|Config.php

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2016 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 = [];// 这里的 static 设置的 比较出神入化
    // 参数作用域
    private static $range = '_sys_';// 同上

    // 设定配置参数的作用域
    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 = '', $name = '', $range = '')
    {// 解析 配置文件
        $range = $range ?: self::$range;// 默认 文件 配置 选项
        if (empty($type)) {// 如果为空
            $type = pathinfo($config, PATHINFO_EXTENSION);// 解析 配置 文件
        }
        $class = false !== strpos($type, '\\') ? $type : '\\think\\config\\driver\\' . ucwords($type);
        // 获取 解析 类文件 分别对应为 ini \ json \ xml 类文件 方式 解析 文件
        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 = '', $range = '')
    {// 加载 配置 文件
        $range = $range ?: self::$range;// 配置文件类型 初始化
        if (!isset(self::$config[$range])) {// 没有设置过,直接初始化
            self::$config[$range] = [];
        }
        if (is_file($file)) {// 如果是文件,
            $type = pathinfo($file, PATHINFO_EXTENSION);// 文件类型
            if ('php' != $type) {
                return self::parse($file, $type, $name, $range);// 解析 默认的 文件 ini xml json
            } else {
                return self::set(include $file, $name, $range);// 获取文件
            }
        } else {
            return self::$config[$range];// 直接返回数据
        }
    }

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

        if (!strpos($name, '.')) {
            return isset(self::$config[$range][strtolower($name)]);
        } else {
            // 二维数组设置和获取支持
            $name = explode('.', $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 = '')
    {// 获取 配置 参数 为空 则获取所有的配置
        $range = $range ?: self::$range;// 配置 类型
        // 无参数时获取所有
        if (empty($name) && isset(self::$config[$range])) {
            return self::$config[$range];
        }// 如果为空,直接返回

        if (!strpos($name, '.')) {// 如果 没有 这个
            $name = strtolower($name);// 返回数据
            return isset(self::$config[$range][$name]) ? self::$config[$range][$name] : null;
        } else {
            // 二维数组设置和获取支持
            $name = explode('.', $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 = '')
    {
        $range = $range ?: self::$range;// 进行 设置 范围圈定,默认的是 _sys_ 系统配置项目
        if (!isset(self::$config[$range])) {// 如果设置了 self::$config 没有设置这个,
            self::$config[$range] = [];// 默认的  初始化 为空
        }
        if (is_string($name)) {// 如果是字符串 默认就是key
            if (!strpos($name, '.')) {// 如果没有.
                self::$config[$range][strtolower($name)] = $value;// self::
            } else {
                // 二维数组设置和获取支持
                // 最大支持到二维数组
                $name                                                 = explode('.', $name);
                self::$config[$range][strtolower($name[0])][$name[1]] = $value;
            }
            return;
        } elseif (is_array($name)) {
            // 批量设置
            if (!empty($value)) {// 如果 value 有数值 此处的 value 变成了 key
                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 = '')
    {// 这个是 个重量级的 函数啊,
        $range = $range ?: self::$range;// 查看是否存在范围
        if (true === $range) {// 如果 传入了 真 清空一切
            self::$config = [];
        } else {
            self::$config[$range] = [];// 否则  清空 指定对象
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值