我需要在我的网站上有一些配置选项。
我认为如果将不同的选项放在不同的文件中,最容易维护。
此外,我需要一个类来从不同的配置文件中检索选项。
在我网站的目录结构中,我创建了一个名为/ setup
的目录在这个目录中,我有几个不同配置选项的文件,例如:/setup/base.php
base.php的内容如下所示:
$setup = new stdClass();
$setup->currencies = array('USD', 'EUR', );
$setup->locations = array('local', 'international', );
我想创建一个读取文件并返回不同选项的类。
class Options
{
function __construct($option)
{
if (!is_file(SETUP_DIR.'/'.$option.'.php')) {
thrown new Exception('Configuration file not found.');
}
$options = // get information from file
return $options; // this should return the currencies and locations
}
}
$options = new Options('base');
但我不知道这是否是正确的做法。
如果是这样,我想不出从类中的安装文件中检索选项的方法。
你能帮我解决这个问题,或者至少指出我正确的方向吗?
答案 0 :(得分:2)
好吧,我认为没有正确的方法:Zend使用.ini文件,Codeigniter有一组数组,Symfony使用YAML。 Wordpress将大部分内容存储在数据库中,并且只包含一个配置文件。
就个人而言,我偏爱ini文件 - ini是遍布各处的东西,因此它有一种感觉,“如果有必要我可以重复使用”,但我认为唯一的“错误”这里的解决方案是不一致的 - 如果你使用的是ini,请使用ini,如果是数组,数组,但不要混用。
在您的情况下,有几个选项。这两个似乎是最常见的。 (这两个示例都假定stdClass对象在加载的文件中名为$options
)您可以创建一个包装器:
class Options
{
private $_options;
function __construct($option)
{
if (!is_file(SETUP_DIR.'/'.$option.'.php')) {
thrown new Exception('Configuration file not found.');
}
require(SETUP_DIR.'/'.$option.'.php');
$this->_options = $options;
// you shouldn't put a return in a constructor
}
// this will point to the internal _options variable.
// making it a read-only access to the values from $option
public function __get($name){ return $this->_options->$name; }
}
或者,您可以使用Singleton模式,只返回各个类中的对象:
class OptionsRetriever
{
private $_fetched;
private static $_instance;
private __construct(){}
public static function &getInstance()
{
if( !isset( self::$_instance ) ) self::$_instance = new OptionsRetriever();
return self::$_instance;
}
public function getConfig( $name )
{
if( !isset( $this->_fetched[ $name ] ) )
{
require(SETUP_DIR.'/'.$name.'.php');
$this->_fetched[ $name ] = $options;
}
return $this->_fetched[ $name ];
}
}
或者,你可以将它们结合起来:
class Options
{
private $_options;
function __construct($options)
{
$this->_options = $options;
}
public function __get($name){ return $this->_options->$name; }
}
// replace getConfig with this
public function getConfig( $name )
{
if( !isset( $this->_fetched[ $name ] ) )
{
require(SETUP_DIR.'/'.$name.'.php');
$this->_fetched[ $name ] = new Options( $options );
}
return $this->_fetched[ $name ];
}
答案 1 :(得分:1)
您可以使用ini文件的概念和PHP中的parse_ini_file
函数来完成此任务。 php.net功能页面上有一些明显的例子:parse_ini_file @ PHP.NET
答案 2 :(得分:1)
你可以包含base.php文件,如下所示:
class Options
{
function __construct($option)
{
if (!is_file(SETUP_DIR.'/'.$option.'.php')) {
thrown new Exception('Configuration file not found.');
}
include_once(SETUP_DIR.'/'.$option.'.php');
$options = $setup; // make sure your variable in the config is allways named $setup
return $options; // this should return the currencies and locations
}
}
$options = new Options('base');
echo $options->currencies[0]; //should print 'USD' provided that your base.php file from the question was used.
答案 3 :(得分:0)
如果您不想直接存储在PHP中的值,则需要包含带有值的PHP文件,例如变量,常量或类。
我喜欢使用的方法是将配置存储在XML文件中,然后加载并解析它。如果您更喜欢该格式,则可以使用与JSON相同的方法。只需确保阻止任何浏览器访问这些文件。