За последние 24 часа нас посетили 17542 программиста и 1731 робот. Сейчас ищут 973 программиста ...

Notice: Undefined variable

Тема в разделе "Прочее", создана пользователем dAllonE, 13 ноя 2008.

  1. dAllonE

    dAllonE Guest

    Объясните мне, пожалуйста, почему использование необъявленной переменной вызывает Notice, а не Fatal Error?

    Просто я пришел в php, уже после небольшого знакомства с Java, который на такие манипуляции тут же выкатывает {PARAM_NAME} cannot be resolved, что, на мой взгляд, очень удобно.


    Мое ИМХО:
    Объвлять переменный перед использованием это "хороший тон", и удобно это в 1-ю очередь самому программисту. (почему я думаю всем и так понятно).
    Из этого следует, что если переменная не объявлена, то либо это "опечатка", либо объявление, в котором зачастую и присваивается значение, пропущено.
    И в том и другом случае скрипт с большой вероятностью будет работать некорректно.
    А уж отлавливать "засобаченные" переменные в чужих скриптах это просто песня :)

    Из всего этого следует, что лучше всего на использование необъявленной переменной выкатывать FatalError.


    Но, ведь разработчики PHP были умными людьми и куда опытнее меня, значит они это сделали это не случайно.

    Если Вы знаете причину, по которой лучше выдывать Notice, а не Fatal Error, не могли бы Вы меня просвятить, немного?
     
  2. admyx

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

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Многим удобнее наоборот...
    Разработчики сделали удобнее большинству, имхо.
     
  3. adw0rd

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

    С нами с:
    10 ноя 2008
    Сообщения:
    12
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Потомучто язык распиздя...ий
     
  4. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Потому что в PHP объявление переменной до её использования не обязательно. Т.е. в принципе для PHP пофигу:

    $param = date(); и echo $param;
    Он просто тебя предупреждает, что такой переменной нету и вернёт пустоту.
     
  5. vb

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

    С нами с:
    6 июн 2006
    Сообщения:
    911
    Симпатии:
    0
    Адрес:
    Saint-Petersburg
    dAllonE по той же причине, по которой отменили объявление типов. Нравится писать с фаталами, пиши на С++, в бонус там тебе еще типы дадут =)

    А если как попроще хочешь, то юзай нотисы. Не понимаю совершенно негодование по этому поводу. Если бы нотисы не выдовались было бы хоть отчасти понятно =)
     
  6. dAllonE

    dAllonE Guest

    vb, данный пост родился после вечернего просмотра кода с ох**енным количеством собак. :)
     
  7. vb

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

    С нами с:
    6 июн 2006
    Сообщения:
    911
    Симпатии:
    0
    Адрес:
    Saint-Petersburg
    dAllonE
    Собаки сцуко хоршие =) Если они юзаются в качестве подавления нотиса необъявленной переменной, то все не так страшно как малюет Psih =)
     
  8. vb

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

    С нами с:
    6 июн 2006
    Сообщения:
    911
    Симпатии:
    0
    Адрес:
    Saint-Petersburg
    p.s. один из люимых приемов
    PHP:
    1.  
    2. <?php
    3. $id = (int) @$_GET['id'];
    4. ?>
    5.  
     
  9. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Да, только 700% падение скорости работы того куска кода, на который поставлена собака :D Да и вообще, нельзя писать так, что бы появлялись не объявленные переменные, потому что ситуации, когда в переменной ожидается совсем не null постоянны.
     
  10. dAllonE

    dAllonE Guest

    Я понимаю, что PHP, в отличии от компилируемого языка в принципе не особенно важно объявление до использования.

    Я имею в виду, что это неудобно в принципе, т.к. в теории может породить кучу доп. ошибок (что у новичков вроде того с "засобаченным" кодом которого я возился вчера и происходит), а пользы ИМХО никакой.

    Но раз:
    Тогда все понятно.
     
  11. vb

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

    С нами с:
    6 июн 2006
    Сообщения:
    911
    Симпатии:
    0
    Адрес:
    Saint-Petersburg
    Psih
    Где тут 700%?????
    Хочешь сказать это работает
    PHP:
    1.  
    2. <?php
    3. $id = (int) @$_GET['id'];
    4. ?>
    5.  
    на 700% медленее, чем это? =))))
    PHP:
    1.  
    2. <?php
    3. if (!empty($_GET['id'])) $id = (int) $_GET['id']; else $id = 0;
    4. ?>
    5.  
    Не смеши мои тапочки. Результаты тестов в студию =)))))
     
  12. vb

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

    С нами с:
    6 июн 2006
    Сообщения:
    911
    Симпатии:
    0
    Адрес:
    Saint-Petersburg
    Написание кода ламерами может порадить еще больше ошибок в независимости от языка. Если юзаешь собаку то нужно юзать ее с умом. А если не юзаешь, то E_ALL спасет тебя.
     
  13. decoder

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

    С нами с:
    11 фев 2006
    Сообщения:
    469
    Симпатии:
    0
    Мне тут подумалось, а не связано ли это изначально как-то с register_global?...
    С другой стороны я тоже считаю что так оно _удобнее_.
    Иначе бы скрипты "распухали" в начале объявлением сотен переменных...
    Я представил себе такое сейчас...
    Это ужасно...
     
  14. dAllonE

    dAllonE Guest

    Знач я один такой, которому это не нравиться. Хнык. Злые Вы, уйду от Вас на http://www.juga.ru/ :)