2009-04-12 18 views
3

class Account爲例login()函數。你認爲它在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 */ 
}

試試這個時刻忽略任何關於數據清理,密碼salting等方法的擔憂。嚴格專注於login(),這是全球訪問不好juju?我通常在類內避免使用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)是你要求的數據位於你的整個應用程序中,而不是你要求的範圍的本地數據。

這些超全球變化會發生什麼,如果他們在某個地方因爲某種原因剛剛在某個地方發生了變化,或者在執行您的功能期間(上帝禁止)。這可能會成爲一個非常惱人的錯誤重現。

所以我會說這是不好的形式。

0

我想說這取決於你的應用程序的設計。如果班級是一般的,鬆散耦合的班級或模塊,並突然使用這樣的全局變量,那在我的書中這將是不好的做法。但是,如果班級明確地面向需要特定全球變量的特定任務(例如您的登錄示例),我看不到任何明確的反對意見。

7

要回答我自己的問題,我會說是的,訪問超級全局變量沒問題,前提是您不修改它們以跨多個類進行訪問。在後臺沒有任何魔法 - 你只是閱讀狀態,超級全局是PHP爲你提供的。

但是,永遠不要在類中修改全局並在其他地方訪問它。那時你不可能進行單元測試。

+0

所以這個問題只是你在跟自己說話嗎? – cletus 2009-04-12 23:19:17

+1

@cletus常見問題解答告訴您使用答案表單將您的答案發布到自己的問題中,而不是放在您的問題中。如果它陷入低谷,我會知道我錯了,而且全局變量給了我一個噁心的感覺,我需要某種安慰我所做的是對的。 – 2009-04-12 23:25:33

2

一種方法是將所有超全球變成自己的一類。我很肯定Zend Framework有一個自己的類,例如操縱Cookies。