ФорумПрограммированиеPHP для идиотов → Типичный случай Notice undefined variable

Типичный случай Notice undefined variable

  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 1 января 2010 г. 21:39

    Копаясь в чужом коде часто обнаруживаю, что при error_reporting(E_ALL) сыплются нотисы про неопределенные переменные. Причем даже в популярных скриптах, которые вроде не новички писали. Конечно это хреново когда программист теряет контроль над своим кодом. Анализируя почему так происходит, я выделил один типичный расклад. Надеюсь кому-нибудь это пригодится.

    Расклад такой: где-то выше возникновения нотиса есть блок проверок в результате которых определяется логический "флажек" типа "обнаружен такой-то факт". А в месте возникновения нотиса вместо повторной сложной проверки тестируется только этот флажек. Все вродебы красиво. Засада в том, что флажек может быть не только true и false, но может быть неопределен совсем — трехзначная логика.

    Чтобы логика стала двухзначной, можно в начале кода выставить значение по-умолчанию $some_flag=false и нотис пропадет. Правда код из-за множества флажков может сильно распухнуть. На самом деле нас интересует только тот случай, когда "обнаружен такой-то факт". То есть когда флажек определен и равен true!!! Значит проверку

    if ($some_fact)

    надо заменить на

    if (isset($some_fact) && $some_fact)

    или более компактно

    if (!empty($some_fact))


    Функция empty возвращает истину для 0, false или '0' и неопределенной переменной. В нашем случае — то, что надо.
    Я очень люблю и часто использую empty. Потому что знаю как она работает :)
    Читать про функцию: http://ru.php.net/manual/en/function.empty.php
    ιιlllιlllι унц-унц
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 1 января 2010 г. 22:49, спустя 1 час 10 минут 19 секунд

    +1 тоже использую empty.
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 1 января 2010 г. 23:14, спустя 24 минуты 55 секунд

    это не функция, а конструкция языка. использую if(@$flags['flag']) короче чем 5 символов писать :)

    у емпти другие преимущества, это только поверхностный плюс ;)
    Сапожник без сапог
  • Ewg777

    Сообщения: 510 Репутация: N Группа: Джедаи

    Spritz 2 января 2010 г. 9:00, спустя 9 часов 46 минут 24 секунды


    это не функция, а конструкция языка. использую if(@$flags['flag']) короче чем 5 символов писать :)

    у емпти другие преимущества, это только поверхностный плюс ;)
    Все учебники гласят, что игнорирование ошибок - дорогая штука.
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 2 января 2010 г. 9:25, спустя 24 минуты 41 секунду



    это не функция, а конструкция языка. использую if(@$flags['flag']) короче чем 5 символов писать :)

    у емпти другие преимущества, это только поверхностный плюс ;)
    Все учебники гласят, что игнорирование ошибок - дорогая штука.
    учебники пишут чтобы их покупали
    Сапожник без сапог

Пожалуйста, авторизуйтесь, чтобы написать комментарий!