【问题标题】:PHP config file using a nested static array [closed]使用嵌套静态数组的 PHP 配置文件 [关闭]
【发布时间】:2012-12-03 15:33:42
【问题描述】:

我在 PHP 中遇到一个“菜鸟问题”:我会有一个包含类似内容的 conf.php 文件:

<?php

static $oauthConfig = array(
    'facebook'=> array(
        'appId'     => 'xxx' ,
        'secret'    => 'xxx' ,
        'loginURL'  => 'xxx' ,
        'logoutURL' => 'xxx'
    ) ,
    'twitter' => array(
        'appId'     => 'xxx' ,
        'secret'    => 'xxx' ,
        'loginURL'  => 'xxx' ,
        'logoutURL' => 'xxx'
    )
);

?>

我需要一个数组来添加一些嵌套级别,并使其易于理解和访问,例如:

//auth.php , in the same folder than conf.php

<?php

require_once( 'conf.php' );

$service = $_REQUEST[ 'ref' ];

switch( $service )
{
    case 'facebook':
    {
        $params = $oauthConfig[$service];
        $fb     = OAuthFactory::getInstanceOf( $service , $params );
                    ...
        break;
    }
}

...
?>

我不知道如何使用我的 conf.php 文件,因为包含它不允许我使用数组。我尝试了一些配置(带/不带静态等),但没有办法让它工作......

不幸的是,解析 Google 智慧对我没有多大帮助。

我会避免使用 .ini 文件或 XML conf。

【问题讨论】:

  • 您如何以及在何处包含该文件?
  • 包含它应该允许您使用数组。你能把你的代码部分贴在你包含它的地方吗?
  • 你用静态关键字做什么?您是否将配置包含在函数或类中?
  • 您是否可能已经在另一个范围内require_once 它,所以它不会再次被加载...?
  • @xbonez :我添加了您要求的代码。

标签: php arrays static initialization


【解决方案1】:

您似乎遇到了范围错误,或者您使用的库需要对象而不是数组。不管这个问题如何,考虑使用 INI 文件,尽管您不喜欢它们。它们简单、可预测且具有延展性。例如,如果这是您的 conf.ini:

; comments
[facebook]
appId = 1231456465798
loginURL = "http://www.somewhere/login"

; more comments
[twitter]
appId = 3432423342

您可以通过$conf = parse_ini_file( "conf.ini", true );阅读它

在这种形式中,print_r( $conf ); 显示:

Array (
    [facebook] => Array (
            [appId] => 1231456465798
            [loginURL] => http://www.somewhere/login
        )
    [twitter] => Array (
            [appId] => 3432423342
        ))

如果需要,您可以将其转换为接收库的 stdObject:

$params = (object)$conf['facebook']; var_dump( $params );

object(stdClass)#1 (2) {
  ["appId"]=> string(13) "1231456465798"
  ["loginURL"]=> string(26) "http://www.somewhere/login"
}

【讨论】:

  • 没有反感,只是“企业习惯”。为你带给我的知识 +1。
【解决方案2】:

我认为您正在寻找的是一个全局数组。

global $oauthConfig;
$oauthConfig = array(
'facebook'=> array(
    'appId'     => 'xxx' ,
    'secret'    => 'xxx' ,
    'loginURL'  => 'xxx' ,
    'logoutURL' => 'xxx'
) ,
'twitter' => array(
    'appId'     => 'xxx' ,
    'secret'    => 'xxx' ,
    'loginURL'  => 'xxx' ,
    'logoutURL' => 'xxx'
)
);

【讨论】:

  • 这不是诀窍...但是为什么?
  • 尝试找出它不起作用的位置,首先在 include/require 之后立即通过 print_r 输出数组中的值(也许 nl2br 为了美观)。当文件丢失时,使用 require 获取错误消息。
  • 您无法访问此全局数组的最可能原因是您没有正确地将它传递给函数和类。无论您想在何处访问此数组,都必须使用 global 关键字,否则该数组将超出范围,因此无法访问。
  • @Adder : 我在 conf.php 文件末尾添加了 var_export($oauthConfig) ,它显示了数组的内容,没问题。感谢 nl2br,我不知道 :)
  • 您要在哪里访问阵列以供使用?您在 conf 文件中定义了值,但是您在哪里使用该数组?如果您在 conf.php 中定义变量并将 conf.php 包含在一个文件中,那么您的数组将随之而来。但是,如果您尝试从函数中访问数组的内容,则必须将其作为参数传递给函数或使用 global $oauthConfig; 访问它。从你的职能范围内。见global variables in php not working as expected
【解决方案3】:

你已经在 conf.php 中声明了数组!你只需要包含它并正常使用它:

include "conf.php";

$params=$oauthConfig[$service];

【讨论】:

    猜你喜欢
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多