这几个函数还是来自于QeePHP的核心类Q中。不过,我是自认为,我的configure类有部分写的比他好,不过我没有考虑删除之类的。呵呵。
/**
* 获取指定的设置内容
*
* $option 参数指定要获取的设置名。
* 如果设置中找不到指定的选项,则返回由 $default 参数指定的值。
*
* @code php
* $option_value = Q::ini('my_option');
* @endcode
*
* 对于层次化的设置信息,可以通过在 $option 中使用“/”符号来指定。
*
* 例如有一个名为 option_group 的设置项,其中包含三个子项目。
* 现在要查询其中的 my_option 设置项的内容。
*
* @code php
* // +--- option_group
* // +-- my_option = this is my_option
* // +-- my_option2 = this is my_option2
* // \-- my_option3 = this is my_option3
*
* // 查询 option_group 设置组里面的 my_option 项
* // 将会显示 this is my_option
* echo Q::ini('option_group/my_option');
* @endcode
*
* 要读取更深层次的设置项,可以使用更多的“/”符号,但太多层次会导致读取速度变慢。
*
* 如果要获得所有设置项的内容,将 $option 参数指定为 '/' 即可:
*
* @code php
* // 获取所有设置项的内容
* $all = Q::ini('/');
* @endcode
*
* @param string $option 要获取设置项的名称
* @param mixed $default 当设置不存在时要返回的设置默认值
*
* @return mixed 返回设置项的值
*/
static function ini($option, $default = null)
{
if ($option == '/') return self::$_ini;
if (strpos($option, '/') === false)
{
return array_key_exists($option, self::$_ini)
? self::$_ini[$option]
: $default;
}
$parts = explode('/', $option);
$pos =& self::$_ini;
foreach ($parts as $part)
{
if (!isset($pos[$part])) return $default;
$pos =& $pos[$part];
}
return $pos;
}
/**
* 修改指定设置的内容
*
* 当 $option 参数是字符串时,$option 指定了要修改的设置项。
* $data 则是要为该设置项指定的新数据。
*
* @code php
* // 修改一个设置项
* Q::changeIni('option_group/my_option2', 'new value');
* @endcode
*
* 如果 $option 是一个数组,则假定要修改多个设置项。
* 那么 $option 则是一个由设置项名称和设置值组成的名值对,或者是一个嵌套数组。
*
* @code php
* // 假设已有的设置为
* // +--- option_1 = old value
* // +--- option_group
* // +-- option1 = old value
* // +-- option2 = old value
* // \-- option3 = old value
*
* // 修改多个设置项
* $arr = array(
* 'option_1' => 'value 1',
* 'option_2' => 'value 2',
* 'option_group/option2' => 'new value',
* );
* Q::changeIni($arr);
*
* // 修改后
* // +--- option_1 = value 1
* // +--- option_2 = value 2
* // +--- option_group
* // +-- option1 = old value
* // +-- option2 = new value
* // \-- option3 = old value
* @endcode
*
* 上述代码展示了 Q::changeIni() 的一个重要特性:保持已有设置的层次结构。
*
* 因此如果要完全替换某个设置项和其子项目,应该使用 Q::replaceIni() 方法。
*
* @param string|array $option 要修改的设置项名称,或包含多个设置项目的数组
* @param mixed $data 指定设置项的新值
*/
static function changeIni($option, $data = null)
{
if (is_array($option))
{
foreach ($option as $key => $value)
{
self::changeIni($key, $value);
}
return;
}
if (!is_array($data))
{
if (strpos($option, '/') === false)
{
self::$_ini[$option] = $data;
return;
}
$parts = explode('/', $option);
$max = count($parts) - 1;
$pos =& self::$_ini;
for ($i = 0; $i < = $max; $i ++)
{
$part = $parts[$i];
if ($i < $max)
{
if (!isset($pos[$part]))
{
$pos[$part] = array();
}
$pos =& $pos[$part];
}
else
{
$pos[$part] = $data;
}
}
}
else
{
foreach ($data as $key => $value)
{
self::changeIni($option . '/' . $key, $value);
}
}
}
/**
* 替换已有的设置值
*
* Q::replaceIni() 表面上看和 Q::changeIni() 类似。
* 但是 Q::replaceIni() 不会保持已有设置的层次结构,
* 而是直接替换到指定的设置项及其子项目。
*
* @code php
* // 假设已有的设置为
* // +--- option_1 = old value
* // +--- option_group
* // +-- option1 = old value
* // +-- option2 = old value
* // \-- option3 = old value
*
* // 替换多个设置项
* $arr = array(
* 'option_1' => 'value 1',
* 'option_2' => 'value 2',
* 'option_group/option2' => 'new value',
* );
* Q::replaceIni($arr);
*
* // 修改后
* // +--- option_1 = value 1
* // +--- option_2 = value 2
* // +--- option_group
* // +-- option2 = new value
* @endcode
*
* 从上述代码的执行结果可以看出 Q::replaceIni() 和 Q::changeIni() 的重要区别。
*
* 不过由于 Q::replaceIni() 速度比 Q::changeIni() 快很多,
* 因此应该尽量使用 Q::replaceIni() 来代替 Q::changeIni()。
*
* @param string|array $option 要修改的设置项名称,或包含多个设置项目的数组
* @param mixed $data 指定设置项的新值
*/
static function replaceIni($option, $data = null)
{
if (is_array($option))
{
self::$_ini = array_merge(self::$_ini, $option);
}
else
{
self::$_ini[$option] = $data;
}
}
/**
* 删除指定的设置
*
* Q::cleanIni() 可以删除指定的设置项目及其子项目。
*
* @param mixed $option 要删除的设置项名称
*/
static function cleanIni($option)
{
if (strpos($option, '/') === false)
{
unset(self::$_ini[$option]);
}
else
{
$parts = explode('/', $option);
$max = count($parts) - 1;
$pos =& self::$_ini;
for ($i = 0; $i < = $max; $i ++)
{
$part = $parts[$i];
if ($i < $max)
{
if (!isset($pos[$part]))
{
$pos[$part] = array();
}
$pos =& $pos[$part];
}
else
{
unset($pos[$part]);
}
}
}
}