Что лучше, иссет или нет?

Есть ли разница в скорости между

if (isset($_POST['var']))

or

if ($_POST['var'])

И что лучше или они одинаковые?


person James    schedule 10.05.2009    source источник
comment
Понятно, что для ввода isset() требуется больше времени :/   -  person Chad Grant    schedule 10.05.2009
comment
Просто интересно, есть ли какая-то реальная причина, почему это будет необходимо в этом случае. я думаю нет   -  person James    schedule 10.05.2009


Ответы (5)


Рекомендуется использовать isset по следующим причинам:

  • Если $_POST['var'] является пустой строкой или "0", isset все равно обнаружит, что переменная существует.
  • Если не использовать isset, будет сгенерировано уведомление.
person Ayman Hourieh    schedule 10.05.2009

Они не одинаковы. Рассмотрим условный массив:

$arr = array(
  'a' => false,
  'b' => 0,
  'c' => '',
  'd' => array(),
  'e' => null,
  'f' => 0.0,
);

Предполагая, что $x является одним из этих ключей (от «a» до «f») и ключом «g», которого нет, он работает следующим образом:

  • $arr[$x] равно false для всех ключей от a до g;
  • isset($arr[$x]) равно true для ключей a, b, c, d и f, но false для e и g; и
  • array_key_exists($x, $arr) равно true для всех ключей от a до f, false для g.

Я предлагаю вам взглянуть на жонглирование типами в PHP, особенно преобразование в логические значения.

Наконец, то, что вы делаете, называется микрооптимизацией. Никогда не выбирайте, какой из них воспринимается как более быстрый. То, что быстрее, настолько незначительно, что никогда не должно быть фактором, даже если бы вы могли надежно определить, что быстрее (я не уверен, что вы могли бы это сделать на каком-либо статистически значимом уровне).

person cletus    schedule 10.05.2009
comment
Клетус прав - один SQL-запрос будет в тысячу раз медленнее, чем тысяча проверок isset. Также стоит отметить, что if($arr['g']) сгенерирует неопределенную переменную E_NOTICE. - person Shabbyrobe; 11.05.2009

isset проверяет, имеет ли переменная какое-либо значение, а if проверяет значение переменной.

Например:

// $_POST['var'] == 'false' (the string false)
if (isset($_POST['var'])) {
    // Will enter this if
}
if ($_POST['var']) {
    // Won't enter this one
}

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

person pgb    schedule 10.05.2009
comment
У меня такое ощущение, что вам нужно немного исправить первую строчку. isset не проверяет, имеет ли переменная какое-либо значение, которое она проверяет, если она была создана/создана, $a = ''; isset($a); будет оценена как истина. - person Fernando Silva; 24.07.2014

В строгом PHP вам нужно проверить, установлена ​​ли переменная перед ее использованием.

error_reporting(E_ALL | E_STRICT);

Что ты здесь делаешь

если($вар)

Не проверяет, установлено ли значение. Таким образом, Strict PHP будет генерировать уведомление о неустановленных переменных. (это часто случается с массивами)

Также в строгом PHP (просто к сведению для вас или других) использование unset var в качестве аргумента в функции вызовет уведомление, и вы не можете проверить isset() внутри функции, чтобы избежать этого.

person Ólafur Waage    schedule 10.05.2009
comment
Это не совсем правильно. В этом случае E_STRICT не имеет ничего общего с уведомлением. Даже если E_STRICT отключен, уведомление все равно выдается. - person Matt; 10.05.2009
comment
Вы имеете в виду в коде или в файле журнала? Потому что вам нужно включить E_STRICT в php.ini, чтобы он был выброшен (до PHP 6) - person Ólafur Waage; 10.05.2009

Просто повторяя то, что сказали другие, если вы выполните:

if($variable)

и $variable не установлена, вы получите уведомление об ошибке. плюс..

$var = 0;
if($variable) {
    //This code will never run, because $var is false
}

но использование isset в этом случае вернет true.

person Daniel Sorichetti    schedule 10.05.2009