PHP: Тернарный оператор
Посмотрите на определение функции, которая возвращает модуль переданного числа:
<?php
function abs(int $number): int
{
if ($number >= 0) {
return $number;
}
return -$number;
}
print_r(abs(10) . "\n"); // => 10
print_r(abs(-10) . "\n"); // => 10Но можно записать более лаконично. В PHP есть конструкция, которая работает как if-else, но при этом является выражением — ее результат можно сразу вернуть из функции. Она называется тернарный оператор и является единственным оператором в PHP, который требует три операнда:
<?php
function abs(int $number): int
{
return $number >= 0 ? $number : -$number;
}Общий паттерн выглядит так:
<predicate> ? <expression on true> : <expression on false>
Давайте перепишем начальный вариант getTypeOfSentence() аналогично. Посмотрим, как было:
<?php
function getTypeOfSentence(string $sentence): string
{
$lastChar = $sentence[-1];
if ($lastChar === '?') {
return 'question';
}
return 'normal';
}А теперь — как стало:
<?php
function getTypeOfSentence(string $sentence): string
{
$lastChar = $sentence[-1];
return $lastChar === '?' ? 'question' : 'normal';
}
print_r(getTypeOfSentence('Hodor') . "\n"); // => normal
print_r(getTypeOfSentence('Hodor?') . "\n"); // => questionВы уже могли догадаться, что тернарный оператор можно вкладывать в тернарный оператор. Это возможно, но лучше так не делать. Такой код тяжело читать и отлаживать, поэтому вложенные тернарные операторы считаются очень плохой практикой.
Задание
Кнопка в приложении работает как переключатель: каждое нажатие меняет состояние на противоположное. Реализуйте функцию flipFlop(), которая принимает на вход строку и, если эта строка равна 'flip', возвращает строку 'flop'. В противном случае функция должна вернуть 'flip'.
Примеры вызова:
<?php
flipFlop('flip'); // 'flop'
flipFlop('flop'); // 'flip'Попробуйте написать два варианта функции: с обычным if-else, и с тернарным оператором.
PHP: Тернарный оператор
Посмотрите на определение функции, которая возвращает модуль переданного числа:
<?php
function abs(int $number): int
{
if ($number >= 0) {
return $number;
}
return -$number;
}
print_r(abs(10) . "\n"); // => 10
print_r(abs(-10) . "\n"); // => 10Но можно записать более лаконично. В PHP есть конструкция, которая работает как if-else, но при этом является выражением — ее результат можно сразу вернуть из функции. Она называется тернарный оператор и является единственным оператором в PHP, который требует три операнда:
<?php
function abs(int $number): int
{
return $number >= 0 ? $number : -$number;
}Общий паттерн выглядит так:
<predicate> ? <expression on true> : <expression on false>
Давайте перепишем начальный вариант getTypeOfSentence() аналогично. Посмотрим, как было:
<?php
function getTypeOfSentence(string $sentence): string
{
$lastChar = $sentence[-1];
if ($lastChar === '?') {
return 'question';
}
return 'normal';
}А теперь — как стало:
<?php
function getTypeOfSentence(string $sentence): string
{
$lastChar = $sentence[-1];
return $lastChar === '?' ? 'question' : 'normal';
}
print_r(getTypeOfSentence('Hodor') . "\n"); // => normal
print_r(getTypeOfSentence('Hodor?') . "\n"); // => questionВы уже могли догадаться, что тернарный оператор можно вкладывать в тернарный оператор. Это возможно, но лучше так не делать. Такой код тяжело читать и отлаживать, поэтому вложенные тернарные операторы считаются очень плохой практикой.
Задание
Кнопка в приложении работает как переключатель: каждое нажатие меняет состояние на противоположное. Реализуйте функцию flipFlop(), которая принимает на вход строку и, если эта строка равна 'flip', возвращает строку 'flop'. В противном случае функция должна вернуть 'flip'.
Примеры вызова:
<?php
flipFlop('flip'); // 'flop'
flipFlop('flop'); // 'flip'Попробуйте написать два варианта функции: с обычным if-else, и с тернарным оператором.
Ваше упражнение проверяется по этим тестам
<?php
namespace HexletBasics\Conditionals\TernaryOperator;
use HexletBasics\Exercise\TestCase;
class SolutionTest extends TestCase
{
public function test()
{
$this->assertEquals('flop', flipFlop('flip'));
$this->assertEquals('flip', flipFlop('flop'));
$this->assertEquals('flip', flipFlop(''));
}
}Решение учителя откроется через:
20:00
