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