Оператор Элвис

Вкратце

<this, if it's true> ?: <this otherwise>

// например
$name ?: $nickname;

Вообразим задачу: на сайте у пользователей могут быть имена и псевдонимы. Имя не обязательно, но если оно есть, то нужно обращаться к человеку по имени, а если нет, то по псевдониму.

Попробуем собрать строку с приветствием человека по этим требованиям:

function generateGreeting($name, $nickname)
{
    if ($name) {
        return "Hello, {$name}!";
    } else {
        return "Hello, {$nickname}!";
    }
}

generateGreeting('Bob', 'CoolBob86'); // => 'Hello, Bob!'
generateGreeting('', 'CoolBob86'); // => 'Hello, CoolBob86!'

Мы воспользовались тем фактом, что PHP преобразовывает типы. В коде if ($name) PHP превратит $name в тип bool — если была пустая строка, то получится false, в ином случае получится true.

С тернарным оператором можно получить более короткую запись:

function generateGreeting($name, $nickname)
{
    return $name ? "Hello, {$name}!" : "Hello, {$nickname}!";
}

generateGreeting('Bob', 'CoolBob86'); // => 'Hello, Bob!'
generateGreeting('', 'CoolBob86'); // => 'Hello, CoolBob86!'

Это частый случай: мы оперируем значениями bool и получить первое значение если оно true, или второе в ином случае.

В PHP для таких случаев есть специальный оператор:

function generateGreeting($name, $nickname)
{
    $user = $name ?: $nickname;
    return "Hello, {$user}!";
}

generateGreeting('Bob', 'CoolBob86'); // => 'Hello, Bob!'
generateGreeting('', 'CoolBob86'); // => 'Hello, CoolBob86!'

?: — бинарный оператор, который возвращает первый операнд если он истинен, и второй в ином случае.

Его называют Elvis, потому что:

А еще слово Elvis напоминает “else if”.

Задание

Напишите функцию generateAmount, которая принимает два числа: количество товаров и стоимость аудита. Если товаров 0, то функция возвращает стоимость аудита, умноженную на 3. Если товаров не 0, то функция возвращает количество товаров.

Примеры вызова:

generateAmount(0, 2); // => 6
generateAmount(0, 5); // => 15
generateAmount(1, 2); // => 1
generateAmount(12, 49); // => 12

Определения
  • Оператор Элвис — выражение, возвращающее первый операнд если он true, и второй в ином случае. Например, $name ?: $nickname;

Exercise available only for signed users