【问题标题】:How to create a global configuration file in php [duplicate]如何在php中创建全局配置文件[重复]
【发布时间】:2013-01-05 14:48:44
【问题描述】:

可能重复:
Reading and Writing Configuration Files

我的大部分功能都取决于设置。

到目前为止,我将设置值存储在数据库中。

例如要在页面中显示广告,我正在检查我的数据库是否显示广告

我的意思是这样

$display_ad = 'get value from database';

if ($display_ad) {
echo 'Ad code goes here';
}

这很好。但事实是我有超过 100 个设置。所以我认为如果我在像

这样的 settings.php 文件中定义值,我的数据库负载将会减少
define('DISPLAY_AD', true); 

if (DISPLAY_AD) {
echo 'Ad code goes here';
}

但我不确定这是正确的方法。是define() 是正确的解决方案。或者有没有更好更快的解决方案?

【问题讨论】:

  • 使用define会使您的代码无法测试。

标签: php function configuration


【解决方案1】:

像上面提到的那样,有几个选项包括 .ini 文件(使用 parse_ini_file())、XML(可能与 SimpleXML 混合使用)但是我更喜欢将配置保存在原生 PHP 中。

include() 结构允许包含文件中的一个到 return。这使您可以:

config.php

return [
    'foo' => [
        'bar' => [
            'qux' => true,
        ],
        'zip' => false,
    ],
];

elsewhere.php

function loadConfig($file) {
    if (!is_file($file)) {
        return false;
    }
    return (array) call_user_func(function() use($file) {
        // I always re-scope for such inclusions, however PHP 5.4 introduced 
        // $this rebinding on closures so it's up to you
        return include($file);
    });
}

$config = loadConfig('config.php');

if ($config['foo']['bar']['qux']) {
    // yeop
}
if ($config['foo']['zip']) {
    // nope
}

需要特别小心,因为当您尝试取消引用不存在的维度时,PHP 会在您身上大便:

if ($config['i']['am']['not']['here']) { // poop

}

创建一个包装类/函数来管理配置以满足您的需求是相当简单的。您可以添加对级联配置的支持(在 ASP 世界中是 web.config)、缓存等。

【讨论】:

    【解决方案2】:

    define() 是一种很好的做事方式。另一种方法是定义一个全局数组。比如

    $config['display_ad']=true;
    $config['something_else']='a value';
    //...
    function doSomething() {
       global $config;
       if ($config['display_ad']) echo 'Ad code goes here';
    }
    

    后一种方式是很多项目使用的,比如phpmyadmin,原因可能是你不能define()一个非标量值,例如define('SOME_ARRAY',array('a','b')) 无效。

    【讨论】:

    • 我一直在操作的前提下,如果global是答案,那么你问错了问题,需要重新评估问题。 +1 用于将 OP 带到他需要去的地方,-1 用于global
    • @Bracketworks 我个人尽可能使用define(),但我接受,global 配置可能是问题之一,@987654328 可以正确回答@ 声明。
    • @EugenRieck 我反对。很少有真正的配置global,并且随着应用程序的增长,不同的模块(或其他)将需要独立的配置管理。从全局开始并返回到本地(尤其是在不断增长的代码库中)是我不会给敌人的任务。
    【解决方案3】:

    最简单的执行是一个ini文件。您创建一个如下所示的文件:

    value1 = foo
    value2 = bar
    value3 = baz
    

    然后,从 PHP 中,您可以执行以下操作:

    $iniList = get_ini_file("/path/to/ini/file/you/just/made");
    if ($iniList['value1'] == 'foo') {
        print "This will print because the value was set from get_ini_file."
    }
    

    如果你有很多类似的常量,那比几十个定义方法要好,比数据库提取要快。

    【讨论】:

    • 我想你的意思是parse_ini_file()
    【解决方案4】:

    你也可以像这里一样创建一个类: php.net

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-23
      • 2021-09-11
      • 2011-03-28
      • 1970-01-01
      • 2011-04-01
      • 2017-03-01
      • 1970-01-01
      相关资源
      最近更新 更多