项目中一些常用且重要的常量参数往往不会直接定义在类对象中,都会以配置文件的形式单独存在,这样既安全又便于修改。对于php中常用的配置文件基本分四类:php文件、ini文件、xml文件、yaml文件。其中以xml文件最为常用,原因是在WebServer交互通信中xml常常作为中间件的存在(这种形式由于配置过程较为复杂,现在渐渐淘汰,当下流行以json的形式传递数据)。
为了以后方便使用,也是对自己知识点的总结,借鉴了一些网上大神的思路,将读取配置文件写成工具类
class Settings{
var $_settings = array();
function get($var){
$var = explode('.',$var);
$result = $this->_settings;
foreach($var as $key){
if(!isset($result[$key])){
return false;
}
$result = $result[$key];
}
return $result;
}
function load(){
trigger_error('Not yet implement',E_USER_ERROR);
}
}
/*
读.php类型配置文件
*/
class Settings_PHP extends Settings{
function load($file=null){
if(file_exists($file)==false){
return false;
}
//引入该文件
include($file);
unset($file);
$vars = get_defined_vars();
foreach ($vars as $key => $val) {
if($key == 'this')
continue;
$this->_settings[$key] = $val;
}
}
}
/*
读取.ini类型配置文件
*/
class Settings_INI extends Settings{
function load($file=null){
if(file_exists($file)==false){
return false;
}
$this->_settings = parse_ini_file($file,true);
}
}
/*
读取.yaml类型文件
*/
class Settings_YAML extends Settings{
function load($file=null){
if(file_exists($file)==false){
return false;
}
include('Spyc.php');
$this->_settings = Spyc::YAMLLoad($file);
}
}
/*
读取.xml类型配置文件
*/
class Settings_XML extends Settings{
function load($file=null){
if(file_exists($file)==false){
return false;
}
//simplexml解析出来的xml文件是对象和数组的形式,
//需要用递归的方法循环类型强制转换,将对象转换成数组
$simplexml = simplexml_load_file($file);
$this->_settings = $this->toArray($simplexml);
}
//将对象转换成数组方法
function toArray($sml){
$arr = (array)$sml;
foreach ($arr as $k => $v) {
if($v instanceof simplexmlelement || is_array($v)){
$arr[$k] = $this->toArray($v);
}
}
return $arr;
}
}
注:
1.其中关于yaml文件类的解析需要引入一个外部文件Spyc.php。此文件可在此https://github.com/mustangostang/spyc/下载源码然后引入到项目中。
2.关于xml文件的解析可用另一种安装xmllib拓展,然后引用的形式,方法请自行查找!
调用示例:
1.config.php配置文件
<?php
$db = array(
"servername" => "localhost",
"port" => 3306,
"username" => "root",
"password" => "root",
"dbname" => "test",
);
?>
2.config.ini配置文件
[mysql]
servername = localhost
port = 3306
username = root
password = root
dbname = test
[url]
baidu = https://www.baidu.com
3.config.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<setting>
<db>
<host>loclhost</host>
<port>3306</port>
<username>root</username>
<password>root</password>
<dbname>test</dbname>
</db>
</setting>
4.config.yaml配置文件(注意:配置项键值对之间,值与前面的冒号间需要一个空格)
db:
host: localhost
port: 3306
username: root
password: root
dbname: test
测试代码调用:
$set1 = new Settings_PHP;
$set1->load('config.php');
$val1 = $set1->get('db');
//print_r($val1);
$set2 = new Settings_INI;
$set2->load('config.ini');
$val2 = $set2->get('url');
//print_r($val2);
$set3 = new Settings_XML;
$set3->load('config.xml');
$val3 = $set3->get('db');
print_r($val3);
$set4 = new Settings_YAML;
$set4->load('config.yaml');
$val4 = $set4->get('db');
//print_r($val4);