Это тест OK, чтобы видеть, установлена ли переменная

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

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

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

Вместо...

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

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

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

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

если (expr) оператор

Как описано в разделе о выражениях, выражение оценено к его булеву значению. Если выражение оценит к то ПРАВДА, PHP выполнит оператор, и если это оценит ко ЛЖИ то - это проигнорирует его. Больше информации о том, что значения оценивают ко ЛЖИ, может быть найдено в разделе 'Converting to boolean'.

И от 'Преобразования до булева раздела':

При преобразовании в булевскую переменную следующие значения считают ЛОЖЬЮ:

... * специальный ПУСТОЙ УКАЗАТЕЛЬ типа (включая переменные сброса)

Почему руководство старалось бы изо всех сил указывать, что переменные сброса включены, если это - плохая практика? Если это сброшено, это преобразовывается в ПУСТОЙ УКАЗАТЕЛЬ и поэтому оценено правильно условным выражением. Используя isset() найдет тот же результат, но возьмет дополнительные циклы, чтобы сделать так.

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

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

Править: Спасибо все (и это было быстро). Я честно думаю, что все ответы до сих пор являются большими и не знают, чтобы выбрать для ответа... Если Ваш не выбран, я буду все еще upvote: o)

8
задан Community 23 May 2017 в 02:11
поделиться

5 ответов

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

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

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

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

6
ответ дан 3 November 2019 в 13:35
поделиться

Если переменная не установлена, вы получите уведомление . Если вы используете 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 () .

12
ответ дан 3 November 2019 в 13:35
поделиться

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

  1. Использование isset делает намерение ясным - вы проверяете, установлена ли переменная, а не проверяете, истинно ли условие.
  2. if ($not_set) будет иметь значение false, если $not_set действительно установлена, но равна булеву false.
7
ответ дан 3 November 2019 в 13:35
поделиться

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

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

4
ответ дан 3 November 2019 в 13:35
поделиться

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

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

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

if ($foo == 'bar')

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

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

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

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

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

.
1
ответ дан 3 November 2019 в 13:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: