Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > isset + empty


Автор: HackMan 21.2.2008, 14:44
Сколько уже пишу на PHP, но всё мучает глупый вопрос. Пересмотрел не одну сотню скриптов, и в каждом программисты пишут по-своему.

В чём суть... Надо проверить, существует ли переменная, если да - то проверить что в ней и выполнить соответствующие действия.

Я лично делаю так:

Код

if (isset($_GET[value])
  {
    if (!empty($_GET[value])
      do_something;
  }


То есть, сначала проверяю, существует ли такая переменная, и уже потом проверяю что там за значение.
В чужих скриптах чего только не встречал. Одни делают лишь проверку isset(), другие придумывают разные комбинации с @, третьи не делают проверку isset(), а сразу пишут !empty(), ещё одни запихивают всё в один if (if (isset($_GET[value]) && !empty($_GET[value])).

Вот мне очень интересно, как надо?

В документации написан такой кусок кода
Код

<?php
$var = 0;

// Evaluates to true because $var is empty
if (empty($var)) {
    echo '$var is either 0, empty, or not set at all';
}

// Evaluates as true because $var is set
if (isset($var)) {
    echo '$var is set even though it is empty';
}
?>


То есть можно смело делать только одну проверку на empty(), пропуская isset()?

Автор: WolfON 21.2.2008, 15:28
empty проверят и на то существует-ли переменная и присвоено-ли ей значение отличное от null сразу.
isset проверяет только на существование переменной.

Автор: HackMan 21.2.2008, 15:39
То есть вместо

Код

if (isset($_GET[value])
  {
    if (!empty($_GET[value])
      do_something;
  }


можно сразу писать

Код

if (!empty($_GET[value])
  do_something;


не переживая за то, инициализирована ли у нас $_GET[value], правильно?

Автор: GeneralElectric 21.2.2008, 15:40
...следовательно, проверку isset + empty пишут люди, не понимающие, что они делают (таких, впрочем, среди РНР программистов большинство).

Вообще, HackMan, ты свалил в одну кучу разные случаи. И ответ на вопрос "как надо" зависит не от какого-то Устава Программистской Службы, а от конкретной задачи, стоящей перед программистом.

К примеру, если стоит задача заткнуть рот слишком разговорчивому интерпретатору, то конструкции
$var=(isset($_GET['var'])?$_GET['var']:""; и $var=@$_GET['var']; - равнозначны

Если стоит задача проверить переменную на пустоту, то empty. И так далее

Автор: HackMan 21.2.2008, 15:43
GeneralElectric, задача состоит в том, что бы выполнить функцию, зная что в неё не попадут не инициализированные параметры, вот  smile 

Автор: GeneralElectric 21.2.2008, 16:19
HackMan, в этом случае empty не при чем вообще, а параметры просто инициализировать, перед вызовом функции.
isset будет при этом использоваться для проверки, установлена ли переменная.







Автор: CyClon 21.2.2008, 19:02
Если было, сори, все не читал, только сабж.

Итак, empty возвращает true только в том случае, если переменная существует и хиъее значение не false (а так же не NULL, не 0 и не пустая строка)[/b]

Например, empty нельзя использовать для переменных, для которых значение 0 является допустимым.

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

Лично я использую функцию isset для тех переменных, который могут содержать в значение 0, false, NULL или пустая строка.

Добавлено через 59 секунд
Сама по себе функция empty выполняет задачу isset + проверят значение переменной.

Автор: sTa1kEr 22.2.2008, 11:45
Цитата(CyClon @  21.2.2008,  20:02 Найти цитируемый пост)
сли переменная существует и хиъее значение не false (а так же не NULL, не 0 и не пустая строка)

А так же не пустой массив.

Автор: flashaa 22.2.2008, 12:32
Можно сказать проще.
 
isset проверяет, равно ли значение переменной null (cобственно так эта функция и определена в мануале). isset возращает FALSE, если переменная === null.  При этом надо помнить, что неинициализированная переменная  === null(!). Отсюда и проверка на то, была переменная инициализирована.

empty проверяет переменную, на то, может ли она быть преобразована в false. Как различные значения различных типов преобразуются в boolean, виднo на странице http://ru2.php.net/manual/en/types.comparisons.php
Пустая строка, 0, пустой массив и тд - все эти значение преобразуются в false при приведении к булеву типу. Потому ф-ция empty для них возвращает true. Хотя, возможно факт, который я привел НЕ лежит в логике работы empty, однако этот факт подтверждается на практике. И при обдумывании возможных вариантов поведения empty  с различными переменными стоит вспомнить таблицу преобразования переменных в boolean.

Автор: Fortop 22.2.2008, 13:47
Цитата(flashaa @  22.2.2008,  12:32 Найти цитируемый пост)
isset проверяет, равно ли значение переменной null (cобственно так эта функция и определена в мануале). isset возращает TRUE, если переменная === null.  При этом надо помнить, что неинициализированная переменная  === null(!). Отсюда и проверка на то, была переменная инициализирована.

Скорее всего имелось ввиду isset возращает FALSE, если переменная === null

Автор: topy 22.2.2008, 16:30
Хм... еще можно так:
Код

if (isset($_GET['var']) && $_GET['var']!="")
     {
          // проверяет инициирована ли переменная и не пуста ли она (0 допускает)
     }

Автор: flashaa 22.2.2008, 19:29
Цитата(Fortop @  22.2.2008,  13:47 Найти цитируемый пост)
Скорее всего имелось ввиду isset возращает FALSE, если переменная === null 

Да да.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)