Вчера, я отправил ответ на вопрос, который включал несколько (неизвестный мне в то время) очень плохие примеры кода. С тех пор я смотрел на свое фундаментальное знание 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)
Вы столкнетесь с проблемами, если ваша переменная установлена, но имеет значение FALSE, например:
Взято из руководства по PHP.
По сути, использование isset () показывает, что вы явно проверяете, существует ли переменная и не является ли она NULL, в то время как структура вашего оператора if проверяет только, истинна ли переменная. Он более понятен и менее подвержен ошибкам.
Если переменная не установлена, вы получите уведомление
. Если вы используете 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 ()
.
Это нормально, но не является хорошей практикой использовать if
для проверки установленной переменной. Две причины:
isset
делает намерение ясным - вы проверяете, установлена ли переменная, а не проверяете, истинно ли условие. if ($not_set)
будет иметь значение false, если $not_set
действительно установлена, но равна булеву false
. Это обычная практика, но не лучшая - вы всегда должны использовать isset
!
Если ваш $ not_set
установлен, и является логическим значением со значением false
, ваш «тест» завершится неудачно!
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
так же хорош, как и отсутствие переменной