2011-12-23 5 views
1

私は多くのセッションバールを持っています。私はこれを使用する必要があります

$_SESSION[SessionHelper::ROUTING] = SessionHelper::MODULE_A; 

class SessionHelper { 
    const ROUTING = 'SessionHelper.routing'; 
    const MODULE_A = 1; 
    const MODULE_B = 2; 
} 

またはこれですか?

第1のものは維持可能であると思われるが、場合によっては読みにくい。例:

if(isset($_SESSION[SessionHelper::ROUTING]) && 
    $_SESSION[SessionHelper::ROUTING] = SessionHelper::MODULE_A) { 
.... 

2番目は非常に短いですが、変更がある場合は、「ルーティング」が存在するすべての場所を変更する必要があります。さらに、 'ルーティング'文字列が非常に一般的であるため、セッションスコープを汚染する可能性があります。

答えて

3

実際にセッションヘルパーが必要な場合(たとえば、PHPセッションを抽象化するクラスが本当に必要な場合)、$_SESSIONスーパーグローバルはそのクラスの内部だけで(外部ではありません)使用します。スーパーグローバルをカプセル化して、テストダブルに置き換えることができます。

次に、これはセッションストアの使用に依存します。私はそれが非常に動的であると思うので、配列キーを定数として指定する際には、それ以上の使用(たとえば、有効/無効キーチェックが行われていないなど)を指定する必要はありません。

これは意味がないので、これは厳しくは聞こえないことを願っています。不明な点があるかどうか尋ねてください。 jprofittが答えて書いたように、magic numbersは何か非常に便利ですが、私は完全に確信していません。実際にここに紹介するか、それが単なる動的プロパティではない(特にセッションストアクラスを作成する場合)。

+0

これはこの意味ですか?私にお知らせください。 クラスSessionStore { \t const ROUTING = 'SessionStore.routing'; \t \tパブリック関数setRoute($ route){ \t \t $ _SESSION [self :: ROUTING] = $ route; \t} \t \tパブリック関数getRoute(){ \t \t戻りの$ _SESSION [自己:: ROUTING]。 \t} } – Emerald214

+0

例のようなものがあります。少なくとも$ _SESSIONをカプセル化していますが、これは私が言及したポイントの1つです。あ、はい。あなたの例にも利点があります。アプリケーションの残りの部分は、具体的なメソッド名とのインタフェースを必要とします。 – hakre

+0

最後の質問です。このクラスはセッション変数を設定して取得するだけなので、すべての関数が静的である可能性がありますか? (ユーティリティクラス) – Emerald214

2

魔法の文字列と数字は、あなたがそれらを使う必要がある唯一の人でも邪悪です。必要なのは、それらを1か所で更新することを忘れることで、アプリケーション全体が誤動作する可能性があります。

定数を使用することのメンテナンス性に関して言及したように、更新の実装をもっと簡単にすることができます。もう一つの利点は、それらを文書化することができ、多くのIDEがそれを選択して、MODULE_AやMODULE_Bが何を参照しているかなどを忘れた場合に役立ちます。余分な文字を入力するかもしれませんが、どこかで 'ルーティング'のスペルを間違えてコードを掘り起こして、なぜエラーが発生しているのか理解するよりも優れています。

関連する問題