Комментарии 18
Зачем нужна унарная версия оператора '??',
$_POST["action"]?? === "submit"
когда есть оператор '@'?
@$_POST["action"] === "submit"
Оператор '??' более быстрый, потому что не приводит к генерации ошибок.
Почему-то у некоторых сильно бомбит когда они видят @
не зависимо от контекста.
Сам уже давно использую @
для подобных целей, недавно с переходом на PHP 7+ заменил в некоторых местах на ??
, в остальных осталось.
На самом деле есть некоторые преимущества у ??
— он работает только с несуществующими элементами массивов/свойствами объектов, не скрывая ошибок, которые могут при этом возникать. Не то чтобы это было большой проблемой для меня, но всё же ??
будет более чистым способом достичь того же результата.
Да ладно? А как удалить файл без использования "собачки" не подвергая код рейс-кондишн ошибкам? Есть идеи?
if (is_file($some) && !@unlink($some)) {
throw new \RuntimException('Can not delete file ' . $some);
}
Легко:
try {
unlink($some);
} catch (\ErrorException $e) {
// а вот тут бы пригодился предлагаемый retry ;)
}
Что-что, у вас php errors все еще не завернуты в исключения? Ау, бросайте каменный топор уже, мамонты вымерли!
Такой код будет работать только в 7.0+, может быть к счастью. В 5.6 и ниже — исключение бросается в месте декларации set_error_handler.
P.S. тогда уж вот так:
try {
is_file($some) && unlink($some);
} catch (\ErrorException $e) {
throw new \RuntimException('Can not delete file ' . $some);
}
А в целом, согласен, что-то я не подумал =)
<?php
set_error_handler(function($errno, $errstr, $errfile, $errline, array $errcontext) {
// error was suppressed with the @-operator
if (0 === error_reporting()) {
return false;
}
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
});
try {
unlink('nofile');
} catch(ErrorException $e) {
var_dump($e);
}
retry просто решает такую задачу.
неконсистентный синтаксис. думаю, не примут.
Все сторонние сервисы нужно считать нестабильными, если к ним стучишься через интернет.
Сам использую вот этот retry. Но там нельзя указать тип исключения, как в данном RFC.
Причем без злосчастного goto.
Пара советов:
- GET запросы к сторонним сервисам лучше кешировать у себя и обновлять кеш по крону, а не по запросу от пользователя.
- POST запросу лучше повторять с некоторым временным интервалом, чтоб не досить чужой сервис. А еще лучше их ставить в очередь на обработку, и в случае ошибки, повторно закидывать в очередь.
Между прочим, во многих языках не хватает…
PHP-Дайджест № 111 – свежие новости, материалы и инструменты (12 – 25 июня 2017)