Как проверить, установлена ​​ли переменная объекта - PullRequest
9 голосов
/ 16 февраля 2010

У меня есть класс User, который создается, когда пользователь входит в систему

$user = new User($userId);

Теперь, чтобы проверить, вошел ли пользователь в систему, я попытался сделать

if (isset($user)) {   // user is logged in

} else {   // user is not logged in

}

Однако isset() не работает для объектов? И я также попробовал is_object(). Пожалуйста, порекомендуйте! Надеюсь, есть способ сделать это элегантно, возможно

if ($user->isLoggedIn()) {

}

Спасибо за ваше время!

Ответы [ 4 ]

10 голосов
/ 16 февраля 2010

isset() должно работать, объект или нет. Вы также можете использовать

if ((isset($user)) and ($user instanceof User))

чтобы проверить, установлен ли он и , является ли он объектом класса User.

4 голосов
/ 16 февраля 2010

Проблема в том, что

new User($userid);

будет всегда давать вам объект User, хотя его конструктор, который, вероятно, ищет $userid в базе данных, может заключить, что объект не существует. Вы можете вызвать исключение в конструкторе для недопустимых $userid s и использовать конструкцию try / catch вместо вашего теста isset(), или установить свойство User->valid в конструкторе пользователей, которые существуют, и проверить для этого в вашем тесте.

См. Также этот вопрос для некоторых других идей: Конструктор PHP для возврата NULL

2 голосов
/ 16 февраля 2010

Если вы редактируете свой класс User, вы можете использовать $ user-> isLoggedIn ()

class User {

private $logged_in = false;

...

public function login($uid) {
  ... login code
  $this->logged_in = true;
}

public function isLoggedIn() {
  return $this->logged_in;
}

...
}
1 голос
/ 16 февраля 2010

isset () работает и с объектами. На самом деле это будет работать с чем угодно, пока:

  1. Переменная была объявлена ​​в текущей области действия
  2. Значение переменной отличается от NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...