Это нормальный тест, чтобы увидеть, установлена ​​ли переменная - PullRequest
8 голосов
/ 21 июля 2010

Вчера я опубликовал ответ на вопрос, который включал несколько (неизвестных мне в то время) очень плохих примеров кода.С тех пор я изучал свои фундаментальные знания PHP, что позволило мне думать, что такой код возможен.Это подводит меня к вопросу, на который я не могу найти ответ:

Если я хочу проверить, есть ли для переменной что-либо установленное, допустимо ли это для не использовать isset() или другую вспомогательную функцию?Вот «например»:

if($not_set){
    //do something
} else {
    //do something else
}

Вместо ...

if(isset($not_set)){
    //do something
} else {
    //do something else
}

Из имени переменной видно, что эта переменная не установлена.Следовательно, условие будет ложным, и будет запущена часть else.До сих пор я использовал эту практику, но после вчерашних постов у меня появилось предположение, что это неправильно.

Вот почему я подумал, что было бы неплохо отказаться от функции isset(), описанной выше.Из руководства по PHP:

Конструкция if является одной из наиболее важных функций многих языков, включая PHP.Это позволяет условно выполнять фрагменты кода.PHP имеет структуру if, которая аналогична структуре C:

оператор if (expr)

Как описано в разделе о выражениях, выражение оценивается как его логическое значение.Если выражение оценивается как TRUE, PHP выполнит оператор, а если оно оценивается как FALSE - он проигнорирует его.Дополнительную информацию о том, какие значения оценивают в FALSE, можно найти в разделе «Преобразование в логическое значение».

и в разделе «Преобразование в логическое значение»:

При преобразованиидля логического значения следующие значения считаются ложными:

... * специальный тип NULL (включая неустановленные переменные)

Почему руководство изо всех сил заявляет, чтовключены неустановленные переменные, если это плохая практика?Если он не задан, он преобразуется в NULL и, следовательно, корректно оценивается условным выражением.Использование isset() даст тот же результат, но потребует дополнительных циклов для этого.

Может кто-нибудь просветить меня, не ошибся ли я все это время и почему?(И насколько это плохо, может быть?)

Спасибо, ТАК, вы никогда не разочаровываете.

Редактировать: Спасибо всем (и это было быстро).Честно говоря, я думаю, что все ответы до сих пор великолепны, и я не знаю, какой из них выбрать для ответа ... Если ваш ответ не выбран, я все равно буду голосовать: o)

Ответы [ 5 ]

12 голосов
/ 21 июля 2010

Если переменная не установлена, вы получите Notice.Если вы используете isset(), вы не получите уведомление.Таким образом, с точки зрения сообщения об ошибках, лучше использовать isset():)

Пример:

error_reporting(E_ALL);   
if($a) {
   echo 'foo';
}

дает

Notice: Undefined variable: a in /Users/kling/test on line 5

, тогда как

error_reporting(E_ALL);
if(isset($a)) {
   echo 'foo';
}

ничего не выводит.


Суть: если для вас важно качество кода, используйте isset().

7 голосов
/ 21 июля 2010

Это хорошо , но не рекомендуется использовать if для проверки заданной переменной. Две причины с моей головы:

  1. Использование isset проясняет намерение - вы проверяете, установлена ​​ли переменная, а не проверяете, выполняется ли условие.
  2. if ($not_set) оценивается как ложное, когда $not_set фактически установлено, но равно логическому false.
6 голосов
/ 21 июля 2010

Вы столкнетесь с проблемами, если ваша переменная установлена, но оценивается как FALSE, как показано ниже:

  • сам логический FALSE
  • целое число 0 (ноль)
  • Поплавок 0.0 (ноль)
  • пустая строка, а строка "0"
  • массив с нулевыми элементами
  • объект с нулевым членом переменные (только PHP 4)
  • специальный тип NULL (в том числе неустановленные переменные)
  • SimpleXML объекты, созданные из пустых теги

Взято из руководства по PHP.

По сути, использование isset () показывает, что вы явно проверяете, существует ли переменная и не имеет ли значение NULL, в то время как структура вашего оператора if только проверяет, является ли переменная истинной. Это более понятно и менее подвержено ошибкам.

4 голосов
/ 21 июля 2010

Это обычная практика, но не очень хорошая - вы всегда должны использовать isset!

Если ваш $not_set установлен и является логическим значением со значением false, ваш «тест» не пройден!

1 голос
/ 21 июля 2010

isset работает в качестве охранника, не позволяя вам использовать переменные, которые на самом деле не существуют.
if (isset($foo)) и if ($foo) не означают одно и то же. isset просто говорит вам, существует ли переменная на самом деле, и если ее можно использовать, она не оценивает значение самой переменной *.

Следовательно, вы обычно должны использовать один из этих двух шаблонов:

Если переменная обязательно существует, и вы просто хотите проверить ее значение:

if ($foo == 'bar')

Если переменная может существовать или не существовать, и вы хотите проверить ее значение:

if (isset($foo) && $foo == 'bar')

Если вам просто интересно, что переменная установлена ​​ и оценивается как true, т.е. if ($foo), вы можете использовать empty:

if (isset($foo) && $foo)
// is the same as
if (!empty($foo))

* он проверяет null, где null так же хорошо, как и вовсе не установлен

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...