0

我在所有页面中共享 PHP 代码库,并且对于每个 HTTP 请求,我动态地共享require文件"/configs/$site/config.php"。该文件如下所示:

<?php
$SiteConfiguration = [
  'site_title => 'Wiki for Developers',
  'mysql_host' => 'localhost',
  'mysql_db' => 'wiki-devs',
  'articles_per_page' => 10,
  /* ... etc ... */
];
?>

我面临的问题是我不能从函数中完全访问这个变量。

例如:

function DisplayArticles() {
    echo "Displaying ".$SiteConfiguration['articles_per_page'];
}

它将打印 justDisplaying和 not Displaying 10

我怎样才能解决这个问题并让我的 $SiteConfiguration 可以在任何地方访问?我应该使用class吗?这里的最佳做法是什么?

4

4 回答 4

1

global $SiteConfiguration;

在您的函数中,您可以在http://www.php.net/manual/en/language.variables.scope.php找到更多信息

由于您要求提供最佳实践信息:(最简单的形式)

class MySite{
    public static function getConfig(){
       return array(
       'site_title => 'Wiki for Developers',
       'mysql_host' => 'localhost',
       'mysql_db' => 'wiki-devs',
       'articles_per_page' => 10,
       /* ... etc ... */
       );
    }
}

然后在您的代码中,您可以使用

$config = MySite::getConfig();

并使用它。(显然比 MySite 有一个更好、更具描述性的名称;))

好处:

  1. 如果设置正确并且可以找到您的类,您的 php 类自动加载器将自动为您加载它,这意味着不用担心您是否传递了变量,不用担心函数参数的位置,也不会用无助于描述的不必要参数污染您的函数它能做什么。
  2. 您可以准确控制对这些数据的访问,并且可以做到即使是您自己的函数也不会意外更改这些数据,即使在调用其他也需要访问它的函数时也不会。

在我看来,它击败了全局变量,并且击败了通过参数传递,因为它更干净,并且您可以控制对它的所有形式的访问。您可以通过特定的 getter/setter 选项使某些属性只读/可写,计算它被访问的次数以及您能想到的任何其他内容。

于 2012-06-16T00:56:22.220 回答
0

使用全局关键字

function DisplayArticles() {
    global $SiteConfiguration;
    echo "Displaying ".$SiteConfiguration['articles_per_page'];
}

编辑

你应该尽量避免全局变量。

更好的做法是在参数中传递您的数组

function DisplayArticles( array $config ) {
    echo "Displaying ".$config['articles_per_page'];
}


$SiteConfiguration = array( 'site_title' => 'Wiki for Developers',
                            'mysql_host' => 'localhost',
                            'mysql_db' => 'wiki-devs',
                            'articles_per_page' => 10,
                            /* ... etc ... */
                          );

DisplayArticles( $SiteConfiguration );
于 2012-06-16T00:57:04.920 回答
0

这是另一种情况,配置类可以很好地工作:

class Config {
    private static $site_config = array( 'h' => 'Hello', 'w' => 'World');

    public static function get( $key) {
        return isset( self::$site_config[$key]) ? self::$site_config[$key] : null;
    }
}

echo Config::get( 'h') . ' ' . Config::get( 'w');

这将输出:Hello World

于 2012-06-16T01:05:41.540 回答
0

你可以尝试这样的事情。

您的“siteConfiguration.php”文件:

<?php
    $SiteConfiguration = [
        'site_title' => 'Wiki for Developers',
        'mysql_host' => 'localhost',
        'mysql_db' => 'wiki-devs',
        'articles_per_page' => 10
    ];

    return $SiteConfiguration;
?>

而这个功能:

function getConfigVar($var) {
    static $config = array();

    if( empty($config) ) {
        $config = require("siteConfiguration.php");
    }

    return array_key_exists($var, $config) ? $config[$var] : null;
}

也可以修改此函数以处理多个配置。

于 2012-06-16T01:30:45.190 回答