Pull to refresh

Comments 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 стремный с точки зрения программиста (какой-то goto), но от бизнеса реально приходят требования, сделать несколько попыток какого-то проблемного действия (работа со сторонними нестабильными сервисами, например).
retry просто решает такую задачу.

неконсистентный синтаксис. думаю, не примут.

UFO just landed and posted this here

именно поэтому и не примут. все легаси выгребают.

Все сторонние сервисы нужно считать нестабильными, если к ним стучишься через интернет.
Сам использую вот этот retry. Но там нельзя указать тип исключения, как в данном RFC.

Пара советов:


  1. GET запросы к сторонним сервисам лучше кешировать у себя и обновлять кеш по крону, а не по запросу от пользователя.
  2. POST запросу лучше повторять с некоторым временным интервалом, чтоб не досить чужой сервис. А еще лучше их ставить в очередь на обработку, и в случае ошибки, повторно закидывать в очередь.
То есть рубям можно, а похапэ нельзя? При том, что в PHP синтаксис предполагается более гибкий.
Между прочим, во многих языках не хватает…
Sign up to leave a comment.