Посмотрите на определение функции, которая возвращает модуль переданного числа:
<?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, потому что:
А ещё слово Elvis напоминает "else if".
Вам ответят команда поддержки Хекслета или другие студенты.
Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.
Загляните в раздел «Обсуждение»:
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.
Наши выпускники работают в компаниях:
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.
Зарегистрируйтесь или войдите в свой аккаунт