Возьмем пример функции 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
}
И хотя я знаю, что создание функции вне класса для обработки этого параметра, не будет ли это так же плохо, как запутывание глобалов в классе?