这几个函数还是来自于QeePHP的核心类Q中。不过,我是自认为,我的configure类有部分写的比他好,不过我没有考虑删除之类的。呵呵。
PHP代码
- /**
- * 获取指定的设置内容
- *
- * $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]);
- }
- }
- }
- }