web-dev-qa-db-ja.com

プロジェクト設定を保持するためにconfig PHPクラスを設定するのは正しいですか?

プロジェクトごとに通常変更されるさまざまな構成値を保持するためにconfig.phpファイルを作成し、次のようにこのファイルに構成値を保持するためのクラスを定義します。

class Config {
    const DB_SERVER    = 'localhost',
          DB_NAME      = 'abc',
          DB_USERNAME  = 'admin',
          DB_PASSWORD  = '12345',

          WEBSITE_NAME = 'My New Website',
          IMAGE_DIR    = 'img';
}

など、すべての値をクラス内の定数として定義したいので、次のように呼び出します。

$connection = mysql_connect(Config::DB_SERVER, Config::DB_USERNAME, Config::DB_PASSWORD) or die("Database connection failed..");

知りたい:プロジェクト構成を設定するこの方法は正しいですか?この方法には欠点がありますか?そしてそれが間違っていた場合、これを行うための最良の方法は何ですか?

18
Amr

私は同じトピックについて話しているこれらの2つの記事を見つけました、そしてそれらが非常に役に立つので私はここでそれらを共有したいと思いました:

1- PHPクラスを使用して構成データを保存する
2- PHPクラスを使用して構成を保存

彼らが私のためにしたように彼らが助けてくれることを願っています。

7
Amr

それはそうする一つの方法です、はい。悪くない方法、IMO。基本的に、クラスはPHP構文だけで、構成ファイルになります。

ただし、欠点がいくつかあります。

  • あなたはconstを持つことはできません 配列または オブジェクト。 (もちろん、グローバル定数を持つことはできません 配列/オブジェクトもそうです...)(5.6以降、定数配列を持つことができます。それでもconstオブジェクトはありません。ただし、あまり意味がないため、constリソースも持つことができないと確信しています。)

    オブジェクトの静的ゲッターを実装することでこれを回避できます(もちろん、常に同じオブジェクトを返すようにコード化されています)...しかし、ほとんどの場合はこれをお勧めしません。これは、構成内のオブジェクトが設計によって不変である場合にのみ安全なオプションです。 (不変性のために設計されていないオブジェクトは、たとえ偶然であっても、変更が非常に簡単です。)

    (可変性の問題は別として、実際に実行中のコードが構成ファイルにあるというバグがあります...しかし、それは主に個人的な好みです。)

  • このクラスの目的は他のクラスとは異なります。プロジェクトごとに変更するのは意図されたです。通常は構成ファイルを保持する場所など、Configクラスを他のクラスとは別の場所に保持することを検討してください。

  • 実際の構成ファイルでは、実行時に解析するため、欠落したファイルや無効なファイルを処理できる可能性があります(たとえば、デフォルト設定で実行したり、解析可能な部分を使用したり、有用なエラーメッセージを表示したりします)。ただし、構成がPHPコードとして実行されると、構文エラー(または、それを考慮していない場合は、Configクラスがない)があると、アプリが停止します。また、display_errorsをオフにして実行している場合(本番環境で推奨)、問題はそれほど明白ではない可能性があります。

11
cHao

欲しいのは static-keyword!

class Config {
    static $DB_SERVER    = 'localhost';
    static $DB_NAME      = 'abc';
    static $DB_USERNAME  = 'admin';
    static $DB_PASSWORD  = '12345';

    static $WEBSITE_NAME = 'My New Website';
    static $IMAGE_DIR    = 'img';
}

そのように。 ::で呼び出すことはできません。 Config::$DB_SERVER

ところで通常、それらがクラス変数である場合、そのように大きく書くことはありません。 Bigは通常、グローバルを意味します。

2
erikbwork