/
Программирование
/
Курс PHP
/

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

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

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

<?php

function generateGreeting(string $name, string $nickname): string
{
    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.

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

<?php

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

Это частый случай — мы оперируем значениями bool и получаем:

  • Первое значение, если true
  • Второе значение в ином случае

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

<?php

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

Оператор ?: — бинарный оператор, который возвращает первый операнд если он истинен, и второй в ином случае. Еще его называют Elvis, потому что это слово похоже на else if. А еще из-за визуального сходства с Элвисом Пресли:

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

Задание

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

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

<?php

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

Полезное

Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются