[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Нужно ли объявлять переменные?
Rand
Меня мучает вот такой принципиальный вопрос: Я всюду использую не объявленные переменные, но не знаю будет ли на сервере ~E_NOTICE.

Например:
if($_GET['var']) {
$b='не обязательная строка';
}
$str='Основная строка '.$b;

Если var не объявлена выдаст два предупреждения.

Оставить так как есть и дописать в начало скрипта error_reporting(E_ALL & ~E_NOTICE) или же всё таки лучше объявлять переменные:
if(!empty($_GET['var'])) {
$b='не обязательная строка';
}
else $b='';
$str='Основная строка '.$b;

Пример простой, скрипт на самом деле громоздкий и не очень хочется прописывать дополнительные условия, но то, что не объявленные переменные - это семантически не правильно, не дает мне покоя =)



Спустя 20 минут, 28 секунд (23.05.2010 - 22:12) Nikitian написал(а):
Проверяйте существование переменной при ещё обработке при помощи isset(). Например if(isset($_GET['var']) && $_GET['var']>0)

Спустя 18 минут, 54 секунды (23.05.2010 - 22:31) Rand написал(а):
А чем плох !empty? К тому же var может быть строкой. Конечно, можно и !='' сделать, но интересно узнать, почему вас не устроило !empty.

Спустя 3 часа, 45 минут, 46 секунд (24.05.2010 - 02:17) Adil написал(а):
Цитата (Rand @ 23.05.2010 - 23:31)
А чем плох !empty?

empty и isset разные функции.

Спустя 38 минут, 17 секунд (24.05.2010 - 02:55) zarafar написал(а):
Цитата
Меня мучает вот такой принципиальный вопрос: Я всюду использую не объявленные переменные, но не знаю будет ли на сервере ~E_NOTICE.

Если вы имеете ввиду вывод предупреждений в браузер, то на продакшн сервере нужно подавлять вывод в браузер _всех_ ошибок и предупреждений.
Цитата
if($_GET['var']) {
  $b='не обязательная строка';
}
$str='Основная строка '.$b;

Если var не объявлена выдаст два предупреждения.

Если $_GET['var'] == 0, результатом условия будет false, но 0 ведь тоже значение.
Цитата
if(!empty($_GET['var'])) {
  $b='не обязательная строка';
}
else $b='';
$str='Основная строка '.$b;

Тоже самое, если $_GET['var'] == 0, условие вернет не то что вы ожидаете в данном случае. Нужно использовать ф-цию isset().

Спустя 15 минут, 46 секунд (24.05.2010 - 03:11) zarafar написал(а):
А в случае с переменной $b, во втором варианте более правильно. Явное присваивание значения переменной позволит избежать потенциальных ошибок в логике скрипта, и при этом сразу видно, что в этой переменной находится.

Спустя 4 часа, 55 минут, 46 секунд (24.05.2010 - 08:07) Rand написал(а):
Я знаю как работают isset и empty. Мне не нужны пустые значения и нули, поэтому я использовал !empty, всё верно. Nikitian написал в условии isset($_GET['var']) && $_GET['var']>0 - но это же фактически !empty, при условии, что переменная число (за исключением отрицательных значений). Но если переменная строка, то по моему проще написать !empty($_GET['var']) чем isset($_GET['var']) && $_GET['var'] != '' && $_GET['var'] !=0
Вообще !empty я исползовал для подавления notice: undefined index, если условия того требуют я напишу isset.

Я не такой уж новичек, чтобы спрашивать элементарные вопросы по работе функций, вопрос в общем то не в том был. Меня интересует, кто как программирует - обрабатывает ли предупреждения или нет, зная, что на сервере вывод ошибок будет отключен (или сам ставит error_reporting(0)). Во многих движках, что лежат в паблике, обычно программисты на это дело забивают (в новых версиях некоторых популярных движков до сих пор eregi используют, чего уж тут =)). В любом случае всем спасибо.

Спустя 28 минут, 33 секунды (24.05.2010 - 08:35) Kuzya написал(а):
По сути isset и !empty - одинаковые вещи smile.gif
Я использую всегда isset, дабы избежать лишних Notice`ов. Но сейчас почти во всех фрейворках такие ситуации всегда предотвращаются (имею в виду получение необъявленных пользовательских переменных)

Спустя 47 минут, 58 секунд (24.05.2010 - 09:23) Rand написал(а):
Цитата (Kuzya @ 24.05.2010 - 05:35)
По сути isset и !empty - одинаковые вещи smile.gif

ну не совсем smile.gif :
$var = 0;

if (isset($var)) { //истина
echo $var;
}

if (!empty($var)) { //ложь
echo $var;
}

Спустя 13 минут, 43 секунды (24.05.2010 - 09:37) Kuzya написал(а):
Хех, действительно. Спасибо, не знал. Значит всё же лучше использовать isset()

Спустя 1 час, 5 минут, 49 секунд (24.05.2010 - 10:43) Nikitian написал(а):
Цитата (Rand @ 24.05.2010 - 05:07)
Nikitian написал в условии isset($_GET['var']) && $_GET['var']>0 - но это же фактически !empty, при условии, что переменная число (за исключением отрицательных значений). Но если переменная строка, то по моему проще написать !empty($_GET['var']) чем isset($_GET['var']) && $_GET['var'] != '' && $_GET['var'] !=0
Вообще !empty я исползовал для подавления notice: undefined index, если условия того требуют я напишу isset.

Я описал общий вариант, а не ваш конкретный случай. Если не нужны нули и пустые строки, а так же отсутствие переменных, то empty достаточно, однако иногда и ноль вполне себе валидное значение и не стоит забывать совсем про isset.
Да, кстати, не забывайте, что isset и empty - это не функции, а языковые конструкции.
Да и ещё одна неоднозначная ситуация. Ключи массива не надо проверять функцией isset. Сам всё время забываю, но если обратиться к мануалу, то ...


$a = array ('test' => 1, 'hello' => NULL);
var_dump(isset($a['hello'])); // FALSE

// The key 'hello' equals NULL so is considered unset
// If you want to check for NULL key values then try:

var_dump(array_key_exists('hello', $a)); // TRUE

Спустя 1 час, 3 минуты, 39 секунд (24.05.2010 - 11:46) Rand написал(а):
Грубоватый пример, но всё же: есть файл index.php. Какое нибудь действие происходит так index.php?action=view
Вы предлагаете, чтобы избежать notice при запросе "главной страницы" писать:
if(array_key_exists('action'),$_GET) {
//обработка action
//действия

}

вместо
if($_GET['action']) {
//обработка action
//действия

}

?
Но тогда в первом случае надо будет всё равно делать проверку переменной на пустоту, почему я и выбрал !empty (isset в таком случае пропустит index.php?action= и action=0 мне точно не нужно).

Вы извините меня конечно, но вы в своём сообщении написали так, как будто бы я против isset - нет, я использую его также достаточно активно, просто в разных случаях выбираю более подходящий для себя вариант. isset я обычно использую когда мне не нужно знать значение переменной, главное чтобы она была установлена, например так:
if(isset($_GET['logout'])) session_destroy();
или
if(isset($_POST['submit_button'])) {
//обработка формы
}

Спустя 1 час, 49 минут, 49 секунд (24.05.2010 - 13:36) twin написал(а):
Проверку нажатия кнопки как раз лучше осуществлять !empty
В IE с этим проблема возникает. Как то он массив не по русски формирует.
Я сам не помню, sergeiss как то писал об этом.

Спустя 5 минут, 48 секунд (24.05.2010 - 13:42) Rand написал(а):
хм, а вот это интересно уже )) надо потестить... давно я ie не запускал =)
...
sergeiss, если увидишь эту тему отпишись пожалуйста, что там за ошибка была, а то я никогда с таким не сталкивался - интересно, по форуму что-то не могу найти.
...
twin, спасибо за наводку, сейчас проверил свой скрипт в ie - авторизацию не проходит ни с isset ни с !empty =) Будем разбираться.. хаха. Чертов ie, вечно с ним какие-то проблемы. Надо будет сейчас посмотреть, может кукисы не ставятся..
...
Разобрался. Проблема была в инвалидном html: <input type="image" name="go" src="img/send.gif" value="1" />. Firefox проглатывал и отправлял $go=1, а IE 8 нет. Убрал value и в PHP написал isset($_POST['go_x']) вместо isset($_POST['go']). Пока проблем не наблюдаю, isset работает нормально.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.