#### 系统配置类 在整个网站的运行过程中,经常需要用到系统配置文件,比如说数据库配置,需要经常进行读取,所以,写一个系统配置类是必要的,在这个配置类中,我们可以动态操作配置文件,设计的时候,模仿TP的C函数,首先在公共函数中定义一个C函数, ``function C(){ $conf = \S\Config::getInstance(); //获取配置类的单例 $args = func_get_args(); //获取函数中传进来的参数 switch (func_num_args()) { //获取传进来的参数的个数 case 0: //0个参数,读取全部配置 return $conf->get(); //返回config对象的get方法结果 break; case 1: //一个参数,则为读取配置信息的值,如果是数组,为动态设置配置信息的值 if (is_array($args[0])){ return $conf->setAll($args[0]); //返回config对象的setAll方法结果 } return $conf->get($args[0]); //如果不是数组,就是获取该配置信息的值 break; case 2: //两个参数,为设置配置信息的值 return $conf->set($args[0],$args[1]); break; default: break; } }`` 首先获取配置类的单例,然后根据传入参数的个数,调用不同这个类中不同的方法,是获取还是设置信息。 ###### 在配置类中实现方法: ~~~ ~~~``<?php namespace S; class Config{ //这个数组是用来存放配置值的 private $config=[]; //这个变量用来存放单例的 private static $instance; public static function getInstance(){ //单例模式 if (!(self::$instance instanceof self)) { //判断现在的$instance是否是自身类的一个实例 self::$instance = new self; //如果不是的话,证明这个类从来没有实例化过,那么就实例化自己 } return self::$instance; //如果是的话,就返回这个$instance,这个类的实例,这样就能保证在整个程序运行过程中都只有一个Config类的实例,可以节约资源,这就是单例模式 } /** * Config constructor. 构造函数 创建实例时就引入配置文件,并合并,给$config赋值 */ private function __construct(){ //在实例化这个类的时候 就会调用这个构造函数 $sys_conf = []; //系统配置数组 $user_conf = []; //用户配置数组 //系统配置文件 if (file_exists(SYS_CONFIG)){ //如果S-Framework中定义过的系统配置文件路径存在且有效的话,则把这个文件包含进来 $sys_conf = include(SYS_CONFIG); } //用户配置文件 if (file_exists(USER_CONFIG)){ //如果S-Framework中定义过的用户配置文件路径存在且有效的话,则把这个文件包含进来 $user_conf = include(USER_CONFIG); } return $this->config = array_merge($sys_conf,$user_conf); //把用户配置和系统配置合并在同一个数组里,使用户配置覆盖掉相同的系统配置,这样就实现了用户的自定义配置 } /** * @return array 获取config文件中的数据 */ public function get($parm = null){ $value = []; if (isset($this->config) && empty($parm)){ //如果没有参数传进来的话,就返回整个config数组(config数组在构造函数中获得过值) return $this->config; } if (isset($this->config[$parm])){ //如果有参数传进来的话,就在config数组中寻找键值是这个参数的配置项,并将其返回 return $this->config[$parm]; }else{ echo 'config参数错误'; } } public function setAll($arr){ //批量设置配置项 if (is_array($arr)){ //如果传进来的参数是一个数组的话 foreach ($arr as $key => $value) { //就遍历这个数组,每遍历一个键值对,就调用一次set方法,把键与值作为参数传递进去 $this->set($key,$value); //使得每一个键值对都成为一个配置项,然后返回true,证明执行成功 } return true; }else{ return false; //如果传进来的参数不是数组,就返回false,证明执行失败 } } public function set($keys,$values){ //设置配置数组的值 $this->config[$keys] = $values; //使传进来的两个参数的键与值对应 return true; } } `` 以上就是系统配置类,现在我们重新看开始的C()函数,首先获取Config类的对象,然后根据需要调用不同的方法,达到设置与获取配置项的目的。