在PHP项目中使用配置文件

时间:2011-07-13 17:05:09

标签: php

我需要在我的网站上有一些配置选项。

我认为如果将不同的选项放在不同的文件中,最容易维护。

此外,我需要一个类来从不同的配置文件中检索选项。

在我网站的目录结构中,我创建了一个名为/ 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');

但我不知道这是否是正确的做法。

如果是这样,我想不出从类中的安装文件中检索选项的方法。

你能帮我解决这个问题,或者至少指出我正确的方向吗?

4 个答案:

答案 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相同的方法。只需确保阻止任何浏览器访问这些文件。