За последние 24 часа нас посетил 18801 программист и 1594 робота. Сейчас ищет 1121 программист ...

isset && !empty смысл?

Тема в разделе "php.ru/forum/", создана пользователем Easy, 16 июл 2011.

  1. Easy

    Easy Активный пользователь

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    В прикрепленной теме написали как нужно делать новичкам и закрыли её :)
    http://www.php.ru/forum/viewtopic.php?t=7890
    про этот код человек отписался
    PHP:
    1. if(isset($_GET['page']) && !empty($_GET['page']))
    что хватит
    PHP:
    1. if(!empty($_GET['page']))
    но в ответ написали что это не так :)
    так вот,
    если переменная не определена empty вернёт true и не каких ошибок даже при всей строгости вывода ошибок не будет.

    объясните мне нупу почему нужно писать isset?
     
  2. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Easy
    Сам не знаю, во времена Си и прочих ASM надо всегда проверять есть ли переменная, а уже потом читать и проверять пустая она или нет. В свою очередь на РНР видимо дань традиции. Я лично вообще считаю что хватит такого

    PHP:
    1. <?php
    2. // типа крутая обработка ошибок
    3. function my_lucky_error($string) {
    4.     die($string);
    5. }
    6.  
    7. // Нужен нам документ из базы под номером "некий Икс"
    8. // (включая 0 и 1000млрд на 32-битной системе)
    9. $doc_id = ctype_digit(@$_GET['doc_id'])
    10.     ? $_GET['doc_id']
    11.     : my_lucky_error('Document ID is not a number');
    12.  
    13. // Нужен нам например Username не менее чем в 3 символа
    14. $username = strlen(@$_POST['username']) >= 3
    15.     ? $_POST['username']
    16.     : my_lucky_error('Short or empty username');
    17.  
    18. // Ну и "до кучи"
    19. $sort = in_array(@$_GET['sort'], array('ASC', 'DESC'))
    20.     ? $_GET['sort']
    21.     : my_lucky_error('Oh my God, they killed Kenny!');
    22. ?>
    (на хабре писал такое, заминусовали нафик)

    Вроде будет
     
  3. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Полагаю, это рудимент образовавшийся за счет недостаточной документации на php.net в те годы.
     
  4. Easy

    Easy Активный пользователь

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    Кто знает где в сорцах описание лежит этих функций?
    что то не найду)
    я не любитель @, не разу не использовал :)
    я делаю так
    PHP:
    1. $id = !empty($_GET['id']) ? (int) $_GET['id'] : 1; // для ID так как 0 не бывает
    2. $page = isset($_GET['page']) ? (int) $_GET['page'] : 0; // для страниц так как 0 бывает
    всегда пишу с включенными ошибками, у меня пхп настроен на вывод всех ошибок специально, не люблю когда есть нотики :) и не разу не вывело, вот пример только что проверил
    PHP:
    1. <?php
    2. if (!empty($_GET['s']))
    3.     echo $_GET['s']);
    4. ?>
     
  5. Easy

    Easy Активный пользователь

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    заглянул в доку, написано что ошибку не вызывает если переменная не установлена.
    а исходники так и не нашел :)
     
  6. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Только empty - это не функция =)
     
  7. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Ну ты бы еще на года смотрел бы. Эта тема за 2007 год... и если почитать коменты к empty, то там есть такой http://ru2.php.net/manual/en/function.empty.php#80106
     
  8. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Возможно (из каментов на хабре где меня заминусовали) это анонизм для мозга.

    Некоторым людям доставляет удовольствие иллюзия контроля над кодом (типа они теперь во время отладки могут узнать, пришла пустая переменная или не пришла вообще никакая, не смотря на отсутствие практической пользы, ЧСВ поднимается моментально)
     
  9. Easy

    Easy Активный пользователь

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    ну с пустой переменной могут быть ошибки если не правильно понимать что она делает :) как её ен контроль :)
    например
    PHP:
    1. $id = !empty($_GET['id']) ? (int) $_GET['id'] : 1
    на самом деле $id может после этого быть равно 0
    http://site/page?id=a
    и будет 0
    так что можно проверять только через isset :)
     
  10. Easy

    Easy Активный пользователь

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    может и не функция, а языковая конструкция
    только вот почему то от других языковых конструкций она отличается тем, что скобки обязательны, да и в разделе функций находится на офф сайте :)
    http://ru2.php.net/manual/ru/ref.var.php

    хотя в доке всё как функции обозначено)
     
  11. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    использую что-то типа

    PHP:
    1.  
    2. <?php
    3. /**
    4.  * Возвращает элемент из массива или NULL, если его нет
    5.  *
    6.  * @param string $elem
    7.  * @param mixed $array
    8.  * @return mixed
    9.  */
    10. function get($elem, $array) {
    11.     $sourceOfArray = array();
    12.     if (is_array($array))
    13.     $sourceOfArray = $array;
    14.     else {
    15.     switch (strtolower($array)) {
    16.         case 'get': $sourceOfArray = $_GET;
    17.         break;
    18.         case 'post': $sourceOfArray = $_POST;
    19.         break;
    20.         case 'session': $sourceOfArray = $_SESSION;
    21.         break;
    22.         case 'cookie': $sourceOfArray = $_COOKIE;
    23.         break;
    24.         default: return null;
    25.         break;
    26.     }
    27.     }
    28.     if (!array_key_exists($elem, $sourceOfArray))
    29.     return null;
    30.  
    31.     return $sourceOfArray[$elem];
    32. }
    33.  
    34. echo get('asd', $_POST);
    35. ?>
    36.  
     
  12. Denis.Y

    Denis.Y Активный пользователь

    С нами с:
    8 авг 2011
    Сообщения:
    145
    Симпатии:
    0
    Адрес:
    Россия, Самарская область
    из наблюдений: при заполнении формы, если в одно из значений записывать число - 0 (ноль) то проверка - if (!empty($_POST[value])) не прокатывает, потому что empty видит 0 как пустое значение и выводит при проверке true, а ведь значение не пустое, туда занесено значение - 0.
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    возможно empty отработает медленнее без проверки isset
     
  14. Denis.Y

    Denis.Y Активный пользователь

    С нами с:
    8 авг 2011
    Сообщения:
    145
    Симпатии:
    0
    Адрес:
    Россия, Самарская область
    что быстрее ?! print или echo ?! что - isset или empty ?! что раньше - яйцо или курица ?! =) хех
    можно было бы провести эксперимент, 1000 итераций по генерации переменной и проверке каждым из операторов. посмотреть на время выполнения..
    даже интересно стало..
     
  15. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а ты зря хихикаешь. в данном случае может и не будет разницы, но частенько бывает что разница есть.
     
  16. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    !empty($var) при отсутствии переменной генерирует E_NOTICE.

    Конечно медленнее, смотрим тесты обработки ошибок (даже при подавлении) в форуме "Прочие вопросы ПХП".
     
  17. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Было бы логично, если бы empty() генерировал E_NOTICE при передаче ему несуществующей (необъявленной) переменной. Но он их не генерирует...

    http://ru.php.net/manual/ru/function.empty.php

     
  18. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    "!empty($var) при отсутствии переменной генерирует E_NOTICE."
    Cool story, bro [​IMG]

    На самом деле, каждый когда-нибудь для себя делает это странное открытие, что empty() не генерирует нотисов. И я когда-то повелся, и был затроллен Яблоком (Apple). Так что с почином :)
     
  19. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.557
    Симпатии:
    631
    Можно самому делать функции с такой фишкой (сакральное знание)
    Код (Text):
    1.  
    2. function my_empty(&$var) {
    3.     return (bool)$var;
    4. }
     
  20. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    если она нулю равна или пустой строке, то будет неожиданность, как понимаю?
     
  21. asokol

    asokol Активный пользователь

    С нами с:
    17 янв 2012
    Сообщения:
    162
    Симпатии:
    0
    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.
     
  22. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    эмпти не проверяет на нулл =) она говорит о пустоте. пустая строка это пустота =)
    иссет проверит наличие переменной, а пустая она или нет - это уже второй вопрос.
    не путайте.
     
  23. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.557
    Симпатии:
    631
    Нет, всё ОК. empty делает тот же самый (bool), только не бросает нотиса. Ссылки тоже не бросают нотисов - ссылка на неопределенную переменную есть ссылка на null.
    Да, в том вариант её надо было назвать "my_not_empty" =) Правильно так
    Код (Text):
    1. function my_empty(&$var) {
    2.     return !(bool)$var;
    3. }
     
  24. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.557
    Симпатии:
    631
    igordata, да, если переменная равна 0, empty() вернет true.
     
  25. asokol

    asokol Активный пользователь

    С нами с:
    17 янв 2012
    Сообщения:
    162
    Симпатии:
    0
    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)