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

Вкратце

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

// например
$number >= 0 ? $number : -$number

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

<?php

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

    return -$number;
}

Можно ли записать её лаконичнее? Что-то вроде 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';
}

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

Стало:

<?php

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

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

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

Если вы помните, в чём сила выражений, то вероятно уже догадались, что тернарный оператор можно вкладывать в тернарный оператор. Не делайте этого :) Такой код тяжело и читать и отлаживать, это очень плохая практика.

Задание

Реализуйте функцию convertString, которая принимает на вход строку и, если первая буква не заглавная, возвращает перевернутый вариант исходной строки. Если первая буква заглавная, то строка возвращается без изменений.

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

convertString('Hello'); // => 'Hello'
convertString('hello'); // => 'olleh'

Перевернуть строчку можно используя функцию strrev.

Есть разные подходы к решению этой задачи. Возможно, вам пригодятся функции ucfirst, strtoupper и возможность получения символа из строки (например, $str[0]).

Попробуйте написать два варианта функции: с обычным if-else, и с тернарным оператором.


Определения
  • Тернарный оператор — Способ превратить простую условную инструкцию в выражение, например, $number >= 0 ? $number : -$number

Exercise available only for signed users