0

重複の可能性:
構成ファイルの読み取りと書き込み

私の機能のほとんどは設定に依存しています。

現在、設定値をデータベースに保存しています。

たとえば、ページに広告を表示するには、広告を表示するかどうかをデータベースで確認しています

私はこのように意味します

$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()正しい解決策です。または、利用可能なより優れたより高速なソリューションはありますか?

4

4 に答える 4

1

前述のようないくつかのオプションには、.iniファイル ( usingparse_ini_file()など)、XML (おそらくSimpleXMLとの組み合わせ) が含まれますが、ネイティブ PHP で構成を保持することを好みます。

このinclude()構造により、インクルードさreturnれたファイルからの 1 つが可能になります。これにより、次のことが可能になります。

config.php

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

その他.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 の世界ではa laweb.config )、キャッシュなどのサポートを追加できます。

于 2013-01-05T15:40:12.510 に答える
0

define()物事を行うのに非常に良い方法です。別の方法は、グローバル配列を定義することです。そのような

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

define()後者の方法は、phpmyadminなど、多くのプロジェクトで使用されている方法です。理由は、スカラー以外の値を使用できない、たとえばdefine('SOME_ARRAY',array('a','b'))無効である可能性があるためです。

于 2013-01-05T14:54:21.480 に答える
0

実行するのが最も簡単なのは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."
}

同様の定数がたくさんある場合は、数十のdefineメソッドよりも優れており、データベースのフェッチよりも高速です。

于 2013-01-05T14:57:24.073 に答える
0

次のようなクラスを作成することもできます: php.net

于 2013-01-05T16:28:06.473 に答える