Проверка переменных сеанса с помощью empty() и isset() в CodeIgniter 3.x

В документации CodeIgniter 3.0.3 указано, что данные сеанса можно получить несколькими различными способами, включая $_SESSION['item'] и $this->session->item. Это так. Независимо от того, как я устанавливаю переменную сеанса, я вижу, что могу вывести значение в обоих направлениях.

Теперь, когда эта переменная сеанса заполнена, я могу проверить пустое условие, например: if(empty($_SESSION['item'])), и оно оценивается как bool(false), как я и ожидал. Однако, если я проверяю ту же переменную сеанса следующим образом: if(empty($this->session->item)) она оценивается как bool(true), чего я НЕ ожидаю (поскольку я могу повторить ее значение в следующей строке). Почему эти два разных способа проверки пустого состояния оцениваются по-разному?


person MonsoonJoe    schedule 02.12.2015    source источник


Ответы (1)


Это связано с тем, как работает empty(). Сравните эту цитату:

Результат для empty($registry->notEmpty) немного неожиданный, так как значение явно установлено и не пусто. Это связано с тем, что в этих случаях функция empty() использует магическую функцию __isset(). Хотя это отмечено в документации выше, я думаю, стоит упомянуть более подробно, поскольку поведение не является простым. Чтобы добиться желаемых (ожидаемых?) результатов, вам нужно добавить в класс магическую функцию __isset():

(взято с php.net: http://php.net/manual/en/function.empty.php, комментарий пользователя Janci)

person Gabriel machts    schedule 02.12.2015
comment
Ух ты. Это странное поведение. Если переменная имеет значение (и особенно скалярное значение), которое может быть отображено на экране, это немного пугает, что функция empty() видит его как пустое. - person MonsoonJoe; 03.12.2015