gnu-social/plugins/Irc/extlib/phergie/Phergie/Config.php

187 lines
5.0 KiB
PHP
Executable File

<?php
/**
* Phergie
*
* PHP version 5
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.
* It is also available through the world-wide-web at this URL:
* http://phergie.org/license
*
* @category Phergie
* @package Phergie
* @author Phergie Development Team <team@phergie.org>
* @copyright 2008-2010 Phergie Development Team (http://phergie.org)
* @license http://phergie.org/license New BSD License
* @link http://pear.phergie.org/package/Phergie
*/
/**
* Reads from and writes to PHP configuration files and provides access to
* the settings they contain.
*
* @category Phergie
* @package Phergie
* @author Phergie Development Team <team@phergie.org>
* @license http://phergie.org/license New BSD License
* @link http://pear.phergie.org/package/Phergie
*/
class Phergie_Config implements ArrayAccess
{
/**
* Mapping of configuration file paths to an array of names of settings
* they contain
*
* @var array
*/
protected $files = array();
/**
* Mapping of setting names to their current corresponding values
*
* @var array
*/
protected $settings = array();
/**
* Includes a specified PHP configuration file and incorporates its
* return value (which should be an associative array) into the current
* configuration settings.
*
* @param string $file Path to the file to read
*
* @return Phergie_Config Provides a fluent interface
* @throws Phergie_Config_Exception
*/
public function read($file)
{
if (!(strtoupper(substr(PHP_OS, 0, 3)) === 'WIN'
&& file_exists($file))
&& !is_executable($file)
) {
throw new Phergie_Config_Exception(
'Path "' . $file . '" does not reference an executable file',
Phergie_Config_Exception::ERR_FILE_NOT_EXECUTABLE
);
}
$settings = include $file;
if (!is_array($settings)) {
throw new Phergie_Config_Exception(
'File "' . $file . '" does not return an array',
Phergie_Config_Exception::ERR_ARRAY_NOT_RETURNED
);
}
$this->files[$file] = array_keys($settings);
$this->settings += $settings;
return $this;
}
/**
* Merges an associative array of configuration setting values into the
* current configuration settings.
*
* @param array $settings Associative array of configuration setting
* values keyed by setting name
*
* @return Phergie_Config Provides a fluent interface
*/
public function readArray(array $settings)
{
$this->settings += $settings;
return $this;
}
/**
* Writes the values of the current configuration settings back to their
* originating files.
*
* @return Phergie_Config Provides a fluent interface
*/
public function write()
{
foreach ($this->files as $file => &$settings) {
$values = array();
foreach ($settings as $setting) {
$values[$setting] = $this->settings[$setting];
}
$source = '<?php' . PHP_EOL . PHP_EOL .
'return ' . var_export($value, true) . ';';
file_put_contents($file, $source);
}
}
/**
* Checks to see if a configuration setting is assigned a value.
*
* @param string $offset Configuration setting name
*
* @return bool TRUE if the setting has a value, FALSE otherwise
* @see ArrayAccess::offsetExists()
*/
public function offsetExists($offset)
{
return isset($this->settings[$offset]);
}
/**
* Returns the value of a configuration setting.
*
* @param string $offset Configuration setting name
*
* @return mixed Configuration setting value or NULL if it is not
* assigned a value
* @see ArrayAccess::offsetGet()
*/
public function offsetGet($offset)
{
if (isset($this->settings[$offset])) {
$value = &$this->settings[$offset];
} else {
$value = null;
}
return $value;
}
/**
* Sets the value of a configuration setting.
*
* @param string $offset Configuration setting name
* @param mixed $value New setting value
*
* @return void
* @see ArrayAccess::offsetSet()
*/
public function offsetSet($offset, $value)
{
$this->settings[$offset] = $value;
}
/**
* Removes the value set for a configuration setting.
*
* @param string $offset Configuration setting name
*
* @return void
* @see ArrayAccess::offsetUnset()
*/
public function offsetUnset($offset)
{
unset($this->settings[$offset]);
foreach ($this->files as $file => $settings) {
$key = array_search($offset, $settings);
if ($key !== false) {
unset($this->files[$file][$key]);
}
}
}
}