2009-04-12 2 views
3

login()の機能をclass Account内で実行します。PHPでクラスメソッド内のスーパーグローバルにアクセスするのが悪いと思いますか?

class Account { 
/* Class variables */ 

    public function login() { 
     if(isset($_POST['username']) && isset($_POST['password'])) 
      return $this->_formLogin(); 
     else if(isset($_SESSION['accountId'])) 
      return $this->_sessionLogin(); 
     else if(isset($_COOKIE['username']) && isset($_COOKIE['password'])) 
      return $this->_cookieLogin(); 
     else return false; 
    } 

    private function _formLogin() { 
     //perform login actions using $_POST data 
    } 
    /* All that other stuff */ 
}

データ消毒、パスワードの塩漬け、および、そのような目に見えないための方法についての懸念を無視するように、この瞬間のために試してみてください。 login()に厳密に集中している、このグローバルアクセス悪いジュジュですか?クラス内でPHPスーパーグローバルを使用することは通常は避けていますが、このような状況ではできない正当な理由は考えられません。

私は、グローバルがクラス間でやりとりされているときにマジック・イン・ザ・バックグラウンドが発生したくない理由を理解できますが、これらのグローバルはPHPに組み込まれており、クラスによって変更されず、 。

:すべてのページ、後で変更する必要があるかもしれないそのロジックにこれに代えて

$user = new Account($whatever, $objects, $we, $depend, $on); 
if($user->login()) { 
    //Do this stuff when logged in 
}

それは、ユーザーがにログインして必要なページの先頭にこのことになります

$user = new Account($whatever, $objects, $we, $depend, $on); 
if(isset($_POST['username']) && isset($_POST['password'])) 
    $user->formLogin($_POST['username'], $_POST['password']); 
else if(isset($_SESSION['accountId'])) 
    $user->sessionLogin($_SESSION['accountId']); 
else if(isset($_COOKIE['username']) && isset($_COOKIE['password'])) 
    $user->cookieLogin($_COOKIE['username'], $_COOKIE['password']); 
if($user->isLoggedIn() { 
    //Do this stuff when logged in 
}

クラスの外部で関数を作成して処理することはオプションであると認識していますが、クラス内のグローバルを難読化するほど悪くないでしょうか?

答えて

7

私は、これにはまっすぐな答えがないとは言いません。どのようなアイデア(すべての超大域で$_GET$_POST$_SESSION)は、あなたが求めているスコープのローカルではなく、アプリケーション全体にデータを要求しているということです。

これらのスーパーグローバルでは、関数の実行中に何らかの理由で(god禁じられた)どこかで変更された場合はどうなるでしょうか?それは再現するのに非常に面倒なバグであることが判明します。

私はそれが悪い形であると言います。

+0

+1非常に良い点。私はスーパーグローバルを決して変更しないので、他の場所でそれらが変更されているとは考えておらず、後で同じデータに依存するものもあります。 –

+0

スーパーグローバルをロックしてスクリプトの開始後に変更できない場合がありますか?私はそれを調べます。 –

0

私はあなたのアプリケーションのデザインによって異なると言います。クラスが一般的な、疎結合のクラスまたはモジュールであり、突然そのようなグローバル変数を使用すると、それは私の本では悪い習慣になります。しかし、クラスが明らかに、特定のグローバルバールが必要とされる特定のタスク(例:ログインの例)に合わせている場合、私は明確な異論は見ません。

7

私自身の質問に答えるために、はいいいえ、スーパーグローバルにアクセスするのはうれしいですが、複数のクラスにまたがってアクセスするように変更していないのであれば大丈夫です。バックグラウンドでは魔法はありません。あなたは状態を読むだけで、スーパーグローバルはPHPがあなたにそれを提供する方法です。

ただし、クラス内のグローバルを変更して他の場所にアクセスすることは決してありません。それはユニットテストを不可能にするときです。

+0

この質問はちょうどあなた自身に話すことですか? – cletus

+1

@cletusよくある質問は、自分の質問に答えを回答フォームを使って投稿し、あなたの質問に入れないことを示します。それが下落した場合、私は間違っていると分かります。グローバルでは気分が悪い気持ちになります。私がやっていることは正しいと思います。 –

+0

+1 Downvoteが削除されました – karim79

2

1つのアプローチは、すべてのスーパーグローバを独自のクラスにラップすることです。私は、Zend Frameworkが独自のクラスを持っていると確信しています。クッキーを操作する。