一般一個框架會提供一種獲取配置文件的操做類,該類的做用是,加載用戶自定義配置文件,讀取和設置配置文件等操做。php
咱們規定用戶配置文件目錄爲 origin/app/conf
,在該目錄下,config.php
是默認的配置文件,此外,還能夠在該目錄下建立其餘配置文件,例如 db.php
,server.php
等,全部其餘文件也會被自動加載。mysql
配置文件內容直接返回數組。示例redis
app/conf/config.php
sql
<?php return [ 'default' => [ 'controller' => 'index', 'action' => 'index', 'router' => 'querystring', ], 'debug' => true, 'cache' => 'redis', ];
app/conf/db.php
數組
<?php return [ 'mysql' => [ 'host' => '127.0.0.1', 'username' => '', 'password' => '', 'db' => '', 'port' => 3306, 'charset' => 'utf8', 'prefix' => '' ], 'redis' => [ 'scheme' => '', 'host' => '', 'port' => '', ] ];
經過 Config::get($key)
來獲取配置。app
config.php
做爲默認配置文件能夠直接獲取該配置文件內容,多維數組經過.
分隔,例如<?php Config::get('debug'); Config::get('default.route');
db.php
或其餘自定義配置文件,須要添加文件名前綴,例如<?php Config::get('db.mysql.host'); Config::get('db.redis.scheme');
Config
類主要實現如下功能:框架
<?php namespace core; use dispatcher\Container; class Config extends Container { private $conf; public function __construct() { $conf = []; $path = APP_PATH.'/app/conf/'; foreach (scandir($path) as $file) { if (substr($file,-4) != '.php') { continue; } $filename = $path.$file; if ($file == 'config.php') { //1 $conf += require $filename; } else { //2 $k = explode('.', $file)[0]; $conf[$k] = require $filename; } } $this->conf = $conf; }
因爲繼承 Container
,構造函數只執行一次,所以在 __construct()
中加載配置文件能夠避免重複加載。函數
除了 config.php
外的其餘配置文件,須要用文件名做爲 key
。ui
//1 protected function get($key = null, $default=null) { //2 if (empty($key)) { return $this->conf; } //3 if (strpos($key, '.')) { $conf = $this->conf; foreach (explode('.', $key) as $k) { $conf = $conf[$k] ?? $default; } return $conf; } //4 return $this->conf[$key] ?? $default; }
::
執行方法時,該方法須要聲明爲 protected
,如 Config::get($key);
。$key
爲空,則返回全部配置。.
來解析多維數組配置。