2010-07-20 5 views
8

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

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

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

Вместо того, чтобы ...

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

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

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

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

, если (выражение) оператор

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

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

При преобразовании в булевой следующие значениях считаются FALSE:

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

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

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

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

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

+0

Ну, ваш подход * будет * задвижка снята с охраны переменные, но он также поймает другие переменные, которые * * установлены. Таким образом, это не тест для переменных, которые установлены – Gareth

+0

Также см. Http://stackoverflow.com/questions/1960509/isset-and-empty-make-code-ugly – deceze

+0

Эй, деце! Спасибо за все вчера - огромный скачок в моем понимании PHP (как вы можете видеть). Я не видел этого, когда искал, но это в основном то же самое, о чем я думал. – Tim

ответ

6

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

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

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

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

+0

'isset' проверяет, существует ли переменная ** ** (* установлена ​​*) и не является« null ». * * Заданная * часть намного важнее, чем * не 'null' * часть. – deceze

+0

Спасибо за разъяснение. Отредактировано, чтобы добавить это. – jergason

12

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

4

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

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

7

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

  1. Использование isset делает намерение ясно - что вы проверяете, установлена ​​ли переменная, и вместо того, чтобы не проверять, верно ли условие.
  2. if ($not_set) будет оцениваться как false, если $not_set фактически установлен, но равен boolean false.
+0

+1 для упоминания намерение. –

1

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

Таким образом, вы обычно должны использовать одну из этих двух моделей:

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

if ($foo == 'bar') 

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

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

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

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

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

Смежные вопросы