作为程序员一定要保持良好的睡眠,才能好编程

php获取Config配置文件item实现方案

发布时间:2019-04-27


获取配置文件方式


Config::get('db.user.port');

Config::get('db.user.password');



常见配置文件格式

php开发中有ini 、php 后缀为名的配置文件。


ini 是 laravel 常用的配置 。


ini解析方式


parse_ini_file($iniFilePath,true)    //得到数组



实现方式

通过解析 get 方法中 参数   


1、去除两边多余的.

2、以.分割,共计分成2部分  第一部分是 文件名称    第二部分是数组中获取配置文件的item

3、通过分割后的item去查找配置项

4、如果配置文件没有传递任何值,则返回null


PS:主要实现方式  是 通过第一个参数 获取到配置文件    第二步骤 是通过 foreach 去查找对应的item、其中只要是有一项没有,就返回null


代码实现

class Config
{
    const CONFIG_FILE_EXT = '.php';

    private static $configFileName;
    private static $configEnvFilePath;
    private static $configGlobalFilePath;
    private static $configItemName;

   
    public static function get(string $configName = 'Global')
    {
        $configName = trim($configName, '.');
        if (empty($configName)) {
            return null;
        }

        $configName = explode('.', $configName, 2);
        self::$configFileName = empty($configName[0]) ? null : $configName[0];
        self::$configItemName = empty($configName[1]) ? null : $configName[1];

        return self::getConfig();
    }

    private static function getConfig()
    {
        self::$configGlobalFilePath = CONFIG_DIR . self::$configFileName . self::CONFIG_FILE_EXT;
        self::$configEnvFilePath = CONFIG_DIR . ucfirst(RUNTIME_ENVIRONMENT) . DS . self::$configFileName
                                   . self::CONFIG_FILE_EXT;

        if (! is_file(self::$configGlobalFilePath) && ! is_file(self::$configEnvFilePath)) {
            return null;
        }

        if (empty(self::$configItemName)) {
            $config = self::getAllConfigItems();
        } else {
            $config = self::getConfigItem();
        }

        return $config;
    }

    private static function getAllConfigItems()
    {
        $globalConfig = $envConfig = [];
        if (is_file(self::$configGlobalFilePath)) {
            $globalConfig = require self::$configGlobalFilePath;
        }
        if (is_file(self::$configEnvFilePath)) {
            $envConfig = require self::$configEnvFilePath;
        }

        return array_merge($globalConfig, $envConfig);
    }

    private static function getConfigItem()
    {
        if (empty(self::$configItemName)) {
            return null;
        }

        $allConfig = self::getAllConfigItems();
        $keys = explode('.', self::$configItemName);
        $tmpConfig = $allConfig;
        foreach ($keys as $key) {
            if (empty($tmpConfig[$key])) {
                $tmpConfig = null;
                break;
            }
            $tmpConfig = $tmpConfig[$key];
        }

        return $tmpConfig;
    }

    private function __construct()
    {
    }
}


调用方式

Config::get('db.username'); //获取configs目录下 db文件中的 username

Config::get('db.password'); //获取db中的密码