В прикрепленной теме написали как нужно делать новичкам и закрыли её http://www.php.ru/forum/viewtopic.php?t=7890 про этот код человек отписался PHP: if(isset($_GET['page']) && !empty($_GET['page'])) что хватит PHP: if(!empty($_GET['page'])) но в ответ написали что это не так так вот, если переменная не определена empty вернёт true и не каких ошибок даже при всей строгости вывода ошибок не будет. объясните мне нупу почему нужно писать isset?
Easy Сам не знаю, во времена Си и прочих ASM надо всегда проверять есть ли переменная, а уже потом читать и проверять пустая она или нет. В свою очередь на РНР видимо дань традиции. Я лично вообще считаю что хватит такого PHP: <?php // типа крутая обработка ошибок function my_lucky_error($string) { die($string); } // Нужен нам документ из базы под номером "некий Икс" // (включая 0 и 1000млрд на 32-битной системе) $doc_id = ctype_digit(@$_GET['doc_id']) ? $_GET['doc_id'] : my_lucky_error('Document ID is not a number'); // Нужен нам например Username не менее чем в 3 символа $username = strlen(@$_POST['username']) >= 3 ? $_POST['username'] : my_lucky_error('Short or empty username'); // Ну и "до кучи" $sort = in_array(@$_GET['sort'], array('ASC', 'DESC')) ? $_GET['sort'] : my_lucky_error('Oh my God, they killed Kenny!'); ?> (на хабре писал такое, заминусовали нафик) Вроде будет
Кто знает где в сорцах описание лежит этих функций? что то не найду) я не любитель @, не разу не использовал я делаю так PHP: $id = !empty($_GET['id']) ? (int) $_GET['id'] : 1; // для ID так как 0 не бывает $page = isset($_GET['page']) ? (int) $_GET['page'] : 0; // для страниц так как 0 бывает всегда пишу с включенными ошибками, у меня пхп настроен на вывод всех ошибок специально, не люблю когда есть нотики и не разу не вывело, вот пример только что проверил PHP: <?php if (!empty($_GET['s'])) echo $_GET['s']); ?>
заглянул в доку, написано что ошибку не вызывает если переменная не установлена. а исходники так и не нашел
Ну ты бы еще на года смотрел бы. Эта тема за 2007 год... и если почитать коменты к empty, то там есть такой http://ru2.php.net/manual/en/function.empty.php#80106
Возможно (из каментов на хабре где меня заминусовали) это анонизм для мозга. Некоторым людям доставляет удовольствие иллюзия контроля над кодом (типа они теперь во время отладки могут узнать, пришла пустая переменная или не пришла вообще никакая, не смотря на отсутствие практической пользы, ЧСВ поднимается моментально)
ну с пустой переменной могут быть ошибки если не правильно понимать что она делает как её ен контроль например PHP: $id = !empty($_GET['id']) ? (int) $_GET['id'] : 1 на самом деле $id может после этого быть равно 0 http://site/page?id=a и будет 0 так что можно проверять только через isset
может и не функция, а языковая конструкция только вот почему то от других языковых конструкций она отличается тем, что скобки обязательны, да и в разделе функций находится на офф сайте http://ru2.php.net/manual/ru/ref.var.php хотя в доке всё как функции обозначено)
использую что-то типа PHP: <?php /** * Возвращает элемент из массива или NULL, если его нет * * @param string $elem * @param mixed $array * @return mixed */ function get($elem, $array) { $sourceOfArray = array(); if (is_array($array)) $sourceOfArray = $array; else { switch (strtolower($array)) { case 'get': $sourceOfArray = $_GET; break; case 'post': $sourceOfArray = $_POST; break; case 'session': $sourceOfArray = $_SESSION; break; case 'cookie': $sourceOfArray = $_COOKIE; break; default: return null; break; } } if (!array_key_exists($elem, $sourceOfArray)) return null; return $sourceOfArray[$elem]; } echo get('asd', $_POST); ?>
из наблюдений: при заполнении формы, если в одно из значений записывать число - 0 (ноль) то проверка - if (!empty($_POST[value])) не прокатывает, потому что empty видит 0 как пустое значение и выводит при проверке true, а ведь значение не пустое, туда занесено значение - 0.
что быстрее ?! print или echo ?! что - isset или empty ?! что раньше - яйцо или курица ?! =) хех можно было бы провести эксперимент, 1000 итераций по генерации переменной и проверке каждым из операторов. посмотреть на время выполнения.. даже интересно стало..
!empty($var) при отсутствии переменной генерирует E_NOTICE. Конечно медленнее, смотрим тесты обработки ошибок (даже при подавлении) в форуме "Прочие вопросы ПХП".
Было бы логично, если бы empty() генерировал E_NOTICE при передаче ему несуществующей (необъявленной) переменной. Но он их не генерирует... http://ru.php.net/manual/ru/function.empty.php
"!empty($var) при отсутствии переменной генерирует E_NOTICE." Cool story, bro На самом деле, каждый когда-нибудь для себя делает это странное открытие, что empty() не генерирует нотисов. И я когда-то повелся, и был затроллен Яблоком (Apple). Так что с почином
Можно самому делать функции с такой фишкой (сакральное знание) Код (Text): function my_empty(&$var) { return (bool)$var; }
Easy, не слушайте никого, читайте мануал. http://php.net/manual/en/function.isset.html - четко и ясно. Своими словами: если переменная была определена и ее значение не NULL, то isset вернет true. http://php.net/manual/en/function.empty.html - пустой (empty) переменная считается в определенных случаях, которые описаны ниже в Return Values. Поэтому смысла писать isset($var) && !empty($var) нет никакого, потому что это двойная проверка на не NULL.
эмпти не проверяет на нулл =) она говорит о пустоте. пустая строка это пустота =) иссет проверит наличие переменной, а пустая она или нет - это уже второй вопрос. не путайте.
Нет, всё ОК. empty делает тот же самый (bool), только не бросает нотиса. Ссылки тоже не бросают нотисов - ссылка на неопределенную переменную есть ссылка на null. Да, в том вариант её надо было назвать "my_not_empty" =) Правильно так Код (Text): function my_empty(&$var) { return !(bool)$var; }
http://php.net/manual/en/function.empty.html Returns FALSE if var has a non-empty and non-zero value. The following things are considered to be empty: "" (an empty string) 0 (0 as an integer) 0.0 (0 as a float) "0" (0 as a string) NULL FALSE array() (an empty array) var $var; (a variable declared, but without a value in a class)