ZetIndex_Ram
@ZetIndex_Ram

Трюк с тернарным оператором PHP?

Коллеги, выручайте!

Очень бы хотелось использовать такую конструкцию для синтаксического сахара,
сильно бы облегчило мне чтение кода

Auth::check() ?? echo "Вам необходимо сначала авторизоваться"

Auth::check() --> проверяет, авторизован ли пользователь
  • Вопрос задан
  • 832 просмотра
Решения вопроса 1
@Flying
В целом то, что вам нужно скорее ближе к новой функциональности в PHP 8: throw expression. В этом случае ваш код мог бы выглядеть, к примеру, вот так:
Auth::check() ?? throw new AuthenticationRequiredException("Вам необходимо сначала авторизоваться");

Однако, если вы реально хотите именно такой конструкции как ваша - то здесь, конечно, тоже есть варианты, ведь начиная с PHP 7 нам доступен uniform function call syntax и, следовательно, возможны конструкции вида:
Auth::check() ?? (function(){echo "Вам необходимо сначала авторизоваться";})();

Конечно, я ни в коем случае не призываю делать именно так, это плохое решение, но технически возможное.

Существенно лучшим вариантом в этом случае на самом деле будет просто создание отдельной функции, которая будет брать на себя реакцию на такие ситуации:
function failure(string $error): void 
{
  // Просто для того чтобы быть ближе к вашему примеру, 
  // в реальности здесь должна быть нормальная логика обработки, 
  // к примеру тот же throw new RuntimeExcepton($error);
  echo $error;  
}

в этом случае ваш пример сводится к:
Auth::check() ?? failure("Вам необходимо сначала авторизоваться");

Помимо этого обратите внимание на то, что использование null coalescing operator ?? подразумевает, что тип возвращаемого значения функции Auth::check() - это mixed|null что выглядит странно, поскольку от результата проверки ожидается тип boolean.

В реальности здесь лучше подходит сокращённая версия тернарного оператора, т.н. elvis operator. В этом случае ваш код может выглядеть вот так:
class Auth {
    public static function check(): bool 
    {
        return false;
    }
}

function failure(string $error): void 
{
    // В реальности, как указано выше, лучше использовать 
    // throw new RuntimeException($error);   
    // echo используется для примера
    echo $error;
}

Auth::check() ?: failure('Вам необходимо сначала авторизоваться');

Проверить можно здесь.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
zoonman
@zoonman
⋆⋆⋆⋆⋆
Просто выбрасывать исключение нужно внутри метода check() и переименовать его в assert(). Тогда все станет на свои места.
Ответ написан
Ваш ответ на вопрос

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

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