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'];
}

Displayingjustではなくを印刷します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

構成用のクラスがうまく機能する別のケースを次に示します。

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 に答える
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 に答える