4

login()内の関数の例を見てみましょうclass Account

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
}

そして、それを処理するためにクラスの外に関数を作成することはオプションであることは承知していますが、それはクラス内のグローバルを難読化するのと同じくらい悪いことではないでしょうか?

4

4 に答える 4

7

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

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

于 2009-04-12T23:17:01.503 に答える
7

これにはイエスかノーかという明確な答えがあるとは言えません。(すべて superglobals を使用した$_GET $_POST $_SESSION) アイデアは、アプリケーション全体に存在するデータを要求しており、要求しているスコープに対してローカルではないということです。

これらのスーパーグローバルで起こりうることは、何らかの理由で関数の実行前または実行中に (神が禁じている) どこかで変更された場合です。これは、再現するのが非常に面倒なバグになる可能性があります。

だから私はそれが悪い形だと言うでしょう。

于 2009-04-12T23:35:37.857 に答える
2

1 つのアプローチは、すべてのスーパーグローバルを独自のクラスにラップすることです。Zend Framework には、たとえば Cookie を操作するための独自のクラスがあると確信しています。

于 2009-04-12T23:31:21.050 に答える
0

アプリケーションの設計に依存すると思います。クラスが一般的な疎結合のクラスまたはモジュールであり、突然そのようなグローバル変数を使用する場合、それは私の本では悪い習慣です。しかし、クラスが特定のグローバル変数がとにかく必要な特定のタスクに向けて明確に調整されている場合 (たとえば、ログインの例)、明確な異議はありません。

于 2009-04-12T23:15:25.953 に答える