В php используя @ вместо isset - PullRequest
3 голосов
/ 29 июля 2011

В каких условиях я могу использовать символ @ вместо более длинной функции isset()? Если нет, то почему?

Мне нравится использовать это, потому что во многих случаях я могу сохранить несколько кавычек, скобок и точек.

Ответы [ 7 ]

6 голосов
/ 29 июля 2011

Я предполагаю, что вы говорите о операторе подавления ошибок , когда вы произносите @ символ, но это не замена для isset().

isset() используется для определения того, существует ли уже заданная переменная в программе, чтобы определить, безопасно ли использовать эту переменную.

Я подозреваю, что вы пытаетесь использовать переменную независимо от ее существования, но подавляете любые ошибки, которые могут возникнуть из-за этого. Использование оператора @ в начале строки говорит PHP игнорировать любые ошибки и не сообщать о них.

Оператор @ является сокращением для «временно установленного error_reporting(0) для этого выражения». isset() - это совершенно другая конструкция.

1 голос
/ 29 июля 2011

Вы не должны просто использовать @.@ подавляет предупреждения.Это не означает, что код правильный, и предупреждения могут все еще добавляться в ваш файл журнала в зависимости от ваших настроек.Гораздо лучше использовать isset для проверки.

0 голосов
/ 15 ноября 2013

Если по какой-либо другой причине не используйте @ вместо isset из-за этого:

Посмотрите на этот код:

echo (@$test) ?: 'default';

Если $ test равен 'something', тогда вы получите 'something'.

Если $ test пуст, null или не существует, вы получите 'default';

Теперь вот в чем проблема:

Предположим, '0' или FALSE являются правильными ответами?

Если $ test равен '0' или FALSE, тогда вы получите 'default' НЕ '0', как вам бы хотелось.

Длинноформатный троичный - это то, что вы должны использовать:

echo (isset($test)) ? $test : 'default';

Не намного больше кодирования и более надежно, когда дело доходит до аргументов, которые могут быть оценены как логическое ложное.

0 голосов
/ 29 июля 2011

оператор @ также замедляет выполнение кода, как указано здесь: http://php.net/manual/en/language.operators.errorcontrol.php

Но, как уже было отмечено, код работает измеримо медленнее только в случае возникновения ошибки. В этом случае код с использованием isset вместо оператора @ выполняется намного быстрее, как описано здесь: http://seanmonstar.com/post/909029460/php-error-suppression-performance

0 голосов
/ 29 июля 2011

Это зависит от того, что вы пытаетесь сделать. Например, если вы выполняете var_dump () или другую отладку и знаете, что иногда ваше значение не будет установлено, я бы сказал, что в этой ситуации это нормально.

var_dump(@$_REQUEST['sometimesIamSet']);

Если вы используете его в этом случае:

if(@$_REQUEST['something']){
    // do something
}
else{
    // do something else
}

Я бы настоятельно советовал против этого. Вы должны написать свой код, чтобы явно делать то, что вы хотите.

if(isset($_REQUEST['something'])){
    // Hurray I know exactly what is going on!
}
else{
    // Not set!
}

Единственный экземпляр в производстве, о котором я могу подумать, это @, когда вы хотите выдать свою собственную ошибку. Например

$database_connection = @db_connect_function();

if($database_connection === false){
    throw new Exception("DB connection could not be made");
}



Кроме того, посмотрите на ответ PaulPRO. Если то, что он говорит, действительно верно, ваши файлы журнала также могут содержать предупреждения, о которых вы не знаете. Это приведет к тому, что ваши файлы журналов станут менее полезными во время отладки после выпуска.
0 голосов
/ 29 июля 2011

Это технически работает, но есть несколько причин, по которым я предпочитаю явное решение isset при создании вывода, которое я предполагаю, что вы делаете:

  1. Если я новый разработчик, работающий над вашим старым кодом, я узнаю идиому isset.Я знаю, что ты пытаешься сделать.С @ не так просто определить ваше намерение.
  2. Предположим, вы хотите проверить, установлено ли свойство объекта, например $user->name.Если вы просто используете подавление ошибок, чтобы узнать, установлено ли name, вы никогда не будете уведомлены, если $user не определено.Вместо этого лучше запускать isset($user->name) и быть явным, так что если $user не определено, вы будете уведомлены об ошибке.
  3. Подавление ошибок - это плохая привычка в целом.Сообщения об ошибках хороши , и вы должны как можно проще получать уведомления об ошибках.Подавление их, когда в этом нет необходимости, ведет к проблемам в будущем.
0 голосов
/ 29 июля 2011

Насколько я знаю, @ не может заменить isset(). Это оператор подавления ошибок, который предотвращает отображение ошибок, если они существуют в скрипте. Это также довольно плохая привычка, если используется в коде PHP.

...