За последние 24 часа нас посетили 30500 программистов и 1791 робот. Сейчас ищут 1169 программистов ...

Символ @

Тема в разделе "PHP для новичков", создана пользователем eaglenix, 28 мар 2008.

  1. eaglenix

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

    С нами с:
    12 июл 2006
    Сообщения:
    47
    Симпатии:
    0
    Увидел вот этот символ @:
    PHP:
    1. $xxx = @$_POST['xxx'];
    Объясните пожалуйста для чего он, в поиске и гугле не нашел(
     
  2. Clone

    Clone Guest

    @ подавляет вывод ошибок. Если в вызваной функции произойдёт ошибка, на экран ничего не будет выведно вне зависимости от настроек. Рядом с переменными этот знак означает, что не будет выведено Notice при попытке использовать необъявленную переменную. Но вообще это можно было и в мане найти.
     
  3. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    eaglenix
    Добавляй его только в готовом продукте, не пользуйся при отладке. А то будет у тебя стоять в скрипте
    а в html-коде опечатаешься и назовешь поле xxy, в итоге сообщение о ошибке не увидишь, и долго будешь голову ломать, почему-же $xxx пустая. Известные грабли =)
     
  4. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    зачем?
     
  5. eaglenix

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

    С нами с:
    12 июл 2006
    Сообщения:
    47
    Симпатии:
    0
    To all
    Ок спасибо, понил! :wink:
     
  6. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    +1.
    Ненужный символ. Для контроля ошибок юзайте error_reporting.
     
  7. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Elkaz
    Но иногда намного удобнее написать
    чем
    isset($_POST['xxx'])?$xxx=$_POST['xxx']:$xxx=null; чтобы ошибки не возникало )
     
  8. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
  9. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    [vs]
    В начало скрипта - error_reporting (0) и пиши как хочешь xD До первой фатальной xD
     
  10. Psih

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

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    [vs]
    А ты в курсе, что
    PHP:
    1. <?php
    2. $xxx = isset($_POST['bla']) ? $_POST['bla'] : null;
    3. // vs
    4. $xxx = @$_POST['bla'];
    5.  
    по скорости работы разница более 700% составляет, использовать его очень не советуется и что каждое подавление ошибки вызывает огромные накладные расходы, т.к. эта ошибка всёравно обрабатывается, просто сама ошибка не выводится.

    Нормальный скрипт не должен вызывать ни единого Notice. Если я найду такое из-за того, что человек просто забил на проверку - увволю с работы сразу. Пусть PHP и скриптовый язык, но это не значит что можно писать абы как. C/C++/Java такого не прощает вообще, а нафиг мне программист, который пишет абы как - это только кодеры, которые работают за еду.
     
  11. lexa

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

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Psih, не вопрос скриптовости языка, питончег тоже скриптовый, то такие штуки в нём не проходят. Вопрос личной кошерности. ИМХО, если язык позволяет - делай, как удобнее тебе, а не как удобнее какому-то психу с форума. :) А сравнивать пхп с языками с жёсткой типизацией вообще не имеет смысла. Ну да, в сях и яве так, но в пхп - нет. В яве на каждый пук городится класс, в пхп нет, так что теперь делать как в яве?
     
  12. Clone

    Clone Guest

    Я бы не сказал, что жёсткая типизация это плохо. Мне тоже удобнее без @ писать, ибо проблем от него потенциально больше чем выгод... Да и какие он вообще выгоды-то приносит?
     
  13. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    Clone
    Ога...
    (string) $string = $_POST['name'];
    (int) $age = $_POST['age'];
    Что мешает так писать?
    Я считаю, что это наоборот, хорошо, что нет жесткой типизации.

    Выгоды @ действительно не приносит.
     
  14. Clone

    Clone Guest

    Плохо тем, что нам приходится контролировать тип переменной, а не компилятору.
     
  15. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Дык ващще-то в php как раз для облегчения жизни программистам и придумана необязтельность объявления переменной и многое другое.
    Скрипт
    PHP:
    1. <?php
    2. for($a=1;$a<10;$a++)
    3. {
    4.  $str.=$a;
    5. }
    6. ?>
    тоже выведет Notice. Самый правильный выход - сделать примерно как в си - объявить переменную и присвоить ей значение. Типа перед циклом дописать $str=null;. А можно не парится и подписать @. И пофиг лишние тысячные-сотые доли милисекунды. В большинстве скриптов, которые пишет большинство программистов, это не существенно.
     
  16. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    А если где-то уже была объявлена переменная $str?
    PHP:
    1. <?php
    2. $str = '123';
    3. //
    4. //... дофига кода
    5. //
    6. for ($a = 1; $a < 10; $a++) {
    7.     $str .= $a;
    8. }
     
  17. Clone

    Clone Guest

    [vs], ох не знаю для кого это "придумано". В VB тоже есть Option Explict(или как там, запамятовал), только там нет такого понятия как GET-запрос... То есть переменные не могут появиться против воли программиста, им лишь присваивается тип в зависимости от первого значения. В PHP же можно передать условно-любой набор входящих переменных, которые, при использовании неопределённых переменных могут убить скрипт. Или крайне накосячить.
     
  18. Psih

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

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    [vs]
    Можно не значит что так надо писать. Я за такое убиваю, сразу. Переменные надо инициализировать в таком варианте обязательно, потому что не известно что там может в ней быть.
     
  19. lexa

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

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Clone, я не давал оценки ни @, ни жёсткой типизации других языков (см. цитату). Поэтому вопрос мимо. Если хочешь оценок: сам пишу без @, мне он неудобен; языки с жёсткой типизацией мне не подуше - просто потому что потому.

    Elkaz, я говорил про языки с жёсткой типизацией (см. цитату), не про php. Clone напутал, а ты поддержал. ;) Но раз уж, то приведённый тобой код это не жёсткая типизация, это приведение к типу. Сделай "$string + $age" - строка + число. Это еретические домыслы в языках с жёсткой типизацией. Об этом и говорил: php это php, не надо переносить стиль программирования на других языках программируя на php.

    Воооот.
     
  20. Clone

    Clone Guest

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