2012-06-11 26 views
14

私は通常、プロジェクト間から変更されているさまざまな設定値を維持するためにconfig.phpファイルを作成したい、と私は次のようにこのファイルで設定値を維持するためにクラスを定義したい:はそれが右のプロジェクト設定を維持するために設定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.."); 

私が知りたい:プロジェクト構成を設定するこの方法は正しいですされていますか?この方法は何らかの短所を持っていますか?そしてそれが間違っていたら、これを行うための最善の方法は何ですか?

+0

スクリプトに含めることができる設定ファイルの中に 'define( 'DB_VAR'、 'value');'を使用することもできます。 – Mike

+1

@mikeはい、知っていますが、定数名だけを使いたいとは思っていません。この例では "Config"(クラス名)のような設定値であることを示す単語を前に使用します。 – Amr

+0

その場合、 'define( 'CONFIG_DB_VAR'、 'value'); ' – Mike

答えて

1

私が何をしたいことはそのような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

"const"という単語を削除して代わりに "static"を指定すると、定数はなくなり、通常の属性になります。この場合、それぞれの前に "$"を入れてはいけませんか? – Amr

+4

さらに、静的なものは変更することができます...定数はできません... – giorgio

+0

右、彼らは '$'が必要です。私は本当に両方のキーワードを混乱させたと思っていました。あなたが本当に一定の振る舞いをしたいのであれば、PHPではそれをクラスに入れないのが普通です。 Configクラスのオブジェクトを作成せずにこのメソッドを呼び出す場合は、 'static'も必要です。 – erikbwork

8

それははい、それを行うための一つの方法です。それほど悪くない方法、IMO。基本的に、このクラスはPHP構文だけで設定ファイルになります。

欠点のカップルは、しかし、があります。

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

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

    (変更の問題を除けば、設定ファイルに実際の実行コードがありますが、

  • このクラスは、残りの目的とは異なる目的を持っています。は、プロジェクトごとに変更することを意図しています。。あなたは、通常、設定ファイルを維持したいところのように、クラスの残りの部分からどこか離れConfigクラスを維持することを検討してください。

  • 実際の設定ファイルでは、実行時に解析するので、不足しているファイルや無効なファイルを扱うことができます(たとえば、デフォルト設定で実行する、パーツを解析できる部分を使用する、メッセージ)。しかし、あなたの設定がPHPコードとして実行されると、構文エラーやそれを考慮していないと、Configクラスが見つからないと、アプリケーションの動作が停止することになります。 display_errorsをオフにしている場合(本番環境での推奨)、この問題は明らかではありません。

+5

PHP 5.6以降、定数で配列を持つことができます。 – Benjamin

+0

もう1つの欠点は、テスト容易性です。コードの静的な部分は、単体テスト時に正しくモックするのが難しい(または不可能です)。 – David

+0

@David:テスト容易性は、構成クラス定数と他の構成方法の欠点ではありません。オートローディングはカスタム設定クラスを簡単にすることができます...何かが必要になる前に置き換えをロードしてください。問題は、本質的にユニット間関係が関係するため、構成自体が_unit_テストを複雑にすることです。基本的には、誤って使用された場合、すべての設定方式に同じ問題があります。テスト容易性が目標であれば、あなたのアプリケーションのinitコード(と他には何も)は設定の設定を読んで、コンストラクタパラメータなどとして他のものにそれらを分けなければなりません。 – cHao

関連する問題