Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> isset + empty 
:(
    Опции темы
HackMan
Дата 21.2.2008, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Юзверь-программист
**


Профиль
Группа: Участник
Сообщений: 391
Регистрация: 18.6.2005
Где: .ua

Репутация: 1
Всего: 9



Сколько уже пишу на 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()?


--------------------

Завтра - это самый загруженный день недели smile

user posted image

user posted image
PM MAIL ICQ   Вверх
WolfON
Дата 21.2.2008, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 604
Регистрация: 19.7.2004

Репутация: 1
Всего: 8



empty проверят и на то существует-ли переменная и присвоено-ли ей значение отличное от null сразу.
isset проверяет только на существование переменной.
PM MAIL ICQ   Вверх
HackMan
Дата 21.2.2008, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Юзверь-программист
**


Профиль
Группа: Участник
Сообщений: 391
Регистрация: 18.6.2005
Где: .ua

Репутация: 1
Всего: 9



То есть вместо

Код

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


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

Код

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


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

Это сообщение отредактировал(а) HackMan - 21.2.2008, 15:40


--------------------

Завтра - это самый загруженный день недели smile

user posted image

user posted image
PM MAIL ICQ   Вверх
GeneralElectric
Дата 21.2.2008, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: нет
Всего: 16



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

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

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

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

PM MAIL   Вверх
HackMan
Дата 21.2.2008, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Юзверь-программист
**


Профиль
Группа: Участник
Сообщений: 391
Регистрация: 18.6.2005
Где: .ua

Репутация: 1
Всего: 9



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


--------------------

Завтра - это самый загруженный день недели smile

user posted image

user posted image
PM MAIL ICQ   Вверх
GeneralElectric
Дата 21.2.2008, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: нет
Всего: 16



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







PM MAIL   Вверх
CyClon
Дата 21.2.2008, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: нет
Всего: 4



Если было, сори, все не читал, только сабж.

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

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

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

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

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


--------------------
user posted image
PM   Вверх
sTa1kEr
Дата 22.2.2008, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 11
Всего: 146



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

А так же не пустой массив.
PM MAIL   Вверх
flashaa
Дата 22.2.2008, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 1
Всего: 25



Можно сказать проще.
 
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.

Это сообщение отредактировал(а) flashaa - 22.2.2008, 21:11
PM MAIL   Вверх
Fortop
Дата 22.2.2008, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 1
Всего: 42



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

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


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
topy
Дата 22.2.2008, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 18.2.2008

Репутация: нет
Всего: 1



Хм... еще можно так:
Код

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

PM MAIL   Вверх
flashaa
Дата 22.2.2008, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 1
Всего: 25



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

Да да.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.0835 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.