Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Тернарный оператор и Элвис Основы PHP

Посмотрите на определение функции, которая возвращает модуль переданного числа:

<?php

function abs($number)
{
    if ($number >= 0) {
        return $number;
    }

    return -$number;
}

abs(10);  // 10
abs(-10); // 10

Можно ли записать ее лаконичнее? Что-то вроде return ОТВЕТ В ЗАВИСИМОСТИ ОТ УСЛОВИЯ? Для этого справа от return должно быть выражение. Но есть проблема: if — это инструкция, а не выражение.

В PHP существует конструкция, которая по своему действию аналогична конструкции if-else, но при этом является выражением. Она называется тернарный оператор, и именно его мы изучим в этом уроке.

Тернарный оператор — единственный в своем роде оператор, требующий три операнда:

<?php

function abs($number)
{
    return $number >= 0 ? $number : -$number;
}

Общий паттерн выглядит так:

<predicate> ? <expression on true> : <expression on false>`

Тернарный оператор

Давайте перепишем начальный вариант getTypeOfSentence() аналогично. Посмотрим, как было:

  <?php

  function getTypeOfSentence($sentence)
  {
      $lastChar = substr($sentence, -1);

      if ($lastChar === '?') {
          return 'question';
      }

      return 'normal';
  }

А теперь — как стало:

  <?php

  function getTypeOfSentence($sentence)
  {
      $lastChar = substr($sentence, -1);

      return ($lastChar === '?') ? 'question' : 'normal';
  }

  getTypeOfSentence('Hodor');  // normal
  getTypeOfSentence('Hodor?'); // question

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

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

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

<?php

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.

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

<?php

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

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

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

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

<?php

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

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

Элвис


Дополнительные материалы

  1. elvis

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Об обучении на Хекслете

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
от 6 300 ₽ в месяц
Разработка веб-приложений на Laravel
10 месяцев
с нуля
Старт 25 апреля

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»