Использование тернарного оператора ?: с подавлением ошибки?

Нормально ли использовать $c = @$a ? : 'default';вместо$c = isset($a) ? $a : 'default';?

И вроде ошибка, всего лишь, уровня E_NOTICE, а @ смущает все равно. С другой стороны — удобно же!

Кто как считает?

UPD1: Так как empty() игнорирует неопределенную переменную, а «Таблица сравнения типов в PHP» говорит, что !empty() полностью соответствует нестрогому булеву, то корректнее была бы замена:$c = !empty($a) ? $a : 'default'; на $c = @$a ? : 'default';
UPD2: (так как никто не читает уточнения). Рассматриваются, как основные варианты, так же доступ к неопределенным ключам массивов и магическим свойствам объекта, которые могут быть заданы извне.
$e = !empty($array['doubtful']['element']) ? $array['doubtful']['element'] : 'default';
// and
$e = @$array['doubtful']['element'] ? : 'default';

$p = !empty($object->magicProperty) ? $object->magicProperty : 'default';
// and
$p = @$object->magicProperty ? : 'default';
  • Вопрос задан
  • 5304 просмотра
Решения вопроса 2
HighQuality
@HighQuality
☁ Ниндзя девелопер
Предпочитаю не допускать даже E_NOTICE
Ответ написан
PaulZi
@PaulZi
На сколько я знаю подавление ошибки собачкой существенно замедляет код. Поправьте меня если я неправ.
Ответ написан
Пригласить эксперта
Ответы на вопрос 10
@larikov
$a = 0;
$c = @$a ? : 'default';


$a = 0;
$c = isset($a) ? $a : 'default';


Могут вылезти трудноуловимые глюки. К примеру, чему будет равно $c в первом и втором случае? :)
Ответ написан
Это не нормально. К E_NOTICE следует относиться как к настоящей ошибке.
Ответ написан
shushu
@shushu
А я бы сделал так:

function getOrDef($val, $def = 'default')
{
    return !empty($val) ? $val : $def;
}

$a = getOrDef($a, '234');
Ответ написан
try4tune
@try4tune
Использование @ — это очень плохой стиль программирования. Кроме случаев с подавлением вывода ошибок стандартных функций (fopen, fsockopen, ...). Этот оператор не избавляет от ошибки, а просто скрывает ее вывод. Очень не рекомендую. Говорю как ZCE.
Ответ написан
Комментировать
@rozhik
Это $c = @$a?: 'default'; и $c = isset($a)? $a: 'default'; разный код. Посмотрите разницу на 0, '', "\0", false и еще много чем, которое преобразуется в boolean FALSE. По этому нотис вполне верен, учитывая, что на разных версиях PHP будет работать по разному.
Ответ написан
@m-haritonov
У меня на PHP 5.3.16 при выполнении кода $c = @$a ? : 'default'; никаких E_NOTICE не выдаётся. Возможно, у Вас установлен свой обработчик ошибок (через set_error_handler), который игнорирует оператор "@".
Ответ написан
Stdit
@Stdit
Неудивительно, что вас смущает использование «собаки», нутро верно подсказывает, что это — умалчивание ошибки и во многих случаях используется как костыль. А isset, empty и is_null — это очевидная логика, причем разная, и более чистый и понятный код. Я бы рекомендовал забыть что «собака» вообще существует, пока нужда остро не прижмет в каком-нибудь стареньком проекте.
Ответ написан
@m-haritonov
Этот оператор не избавляет от ошибки, а просто скрывает ее вывод.

Собственно, это и утверждается в документации. И в случае с размещением этого оператора перед $_GET['aaa'] именно игнорирование предупреждения о неинициализованой переменной и требуется, т.к., в соответствии с предназначением данного массива, его значения приходят из вне, а не объявляются внутри программы и отсутствие предупреждений было бы уместнее, т.к. иначе приходится писать дополнительный код, которые не несёт в себе полезной нагрузки.

Очень не рекомендую. Говорю как ZCE.

Может, как ZCE, лучше скажите, почему Вы не рекомендуете его использовать? А то сейчас Вы обошлись простым «Это плохо, понятненько?!».
Ответ написан
Комментировать
zBit
@zBit
Full stack web developer
Из прочтённых комментариев я так и не понял, на сколько (не)кошерным является @. Правда это уже не по теме самого вопроса, но всё же.

На сколько кошернее такой вариант:
if (!empty($_POST[qty])) $qty = (int) $_POST['qty'];
else return false;

Чем этот:
if (!@$qty = (int) $_POST['qty']) return false;

Второй, на мой взгляд, проще (ИМХО).

Я не супер-гуру в PHP, но понимаю, что можно решить такую задачу через какую-нибудь абстракицю, хотя бы в виде функции, для увеличения гибкости рабочего решения.
Ответ написан
@m-haritonov
… удалено (не туда разместил)...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы