PHP: Конструкция else if
Функция getTypeOfSentence() различает только вопросительные и обычные предложения. Добавим в нее поддержку восклицательных предложений:
<?php
function getTypeOfSentence(string $sentence): string
{
$lastChar = $sentence[-1];
if ($lastChar === '?') {
$sentenceType = 'question';
}
if ($lastChar === '!') {
$sentenceType = 'exclamation';
} else {
$sentenceType = 'normal';
}
return "Sentence is {$sentenceType}";
}
print_r(getTypeOfSentence('Who?') . "\n"); // => Sentence is normal
print_r(getTypeOfSentence('No') . "\n"); // => Sentence is normal
print_r(getTypeOfSentence('No!') . "\n"); // => Sentence is exclamationМы добавили проверку восклицательных предложений (exclamation переводится «восклицание»). Технически эта функция работает, но вопросительные предложения трактует неверно. Еще в ней есть проблемы с точки зрения семантики. Наличие восклицательного знака проверяется в любом случае, даже если уже обнаружился вопросительный знак. Ветка else описана для второго условия, но не для первого. Поэтому вопросительное предложение становится normal.
Чтобы исправить ситуацию, воспользуемся еще одной возможностью условной конструкции:
<?php
function getTypeOfSentence(string $sentence): string
{
$lastChar = $sentence[-1];
if ($lastChar === '?') {
$sentenceType = 'question';
} elseif ($lastChar === '!') {
$sentenceType = 'exclamation';
} else {
$sentenceType = 'normal';
}
return "Sentence is {$sentenceType}";
}
print_r(getTypeOfSentence('Who?') . "\n"); // => Sentence is question
print_r(getTypeOfSentence('No') . "\n"); // => Sentence is normal
print_r(getTypeOfSentence('No!') . "\n"); // => Sentence is exclamationТеперь все условия выстроились в единую конструкцию. Ключевое слово elseif означает «если не выполнено предыдущее условие, но выполнено текущее».
┌─────────────────┐
│ условие 1? │
└────┬────────┬───┘
true │ │ false
↓ ↓
┌──────────┐ ┌─────────────────┐
│ тело if │ │ условие 2? │
└──────────┘ └────┬────────┬───┘
true │ │ false
↓ ↓
┌────────────┐ ┌──────────┐
│тело elseif │ │ тело else│
└────────────┘ └──────────┘Логика функции устроена так. Если последний символ ?, возвращается 'question'. Если последний символ !, возвращается 'exclamation'. Во всех остальных случаях возвращается 'normal'.
Выполнится только один из блоков кода, который относится ко всей конструкции if.
Задание
Реализуйте функцию getTrafficLightAction(), которая принимает цвет светофора и возвращает, что нужно делать водителю.
Правила:
'green'→'go''yellow'→'slow down''red'→'stop'- Любой другой цвет →
'unknown'
Примеры вызова:
<?php
getTrafficLightAction('green'); // 'go'
getTrafficLightAction('red'); // 'stop'
getTrafficLightAction('purple'); // 'unknown'PHP: Конструкция else if
Функция getTypeOfSentence() различает только вопросительные и обычные предложения. Добавим в нее поддержку восклицательных предложений:
<?php
function getTypeOfSentence(string $sentence): string
{
$lastChar = $sentence[-1];
if ($lastChar === '?') {
$sentenceType = 'question';
}
if ($lastChar === '!') {
$sentenceType = 'exclamation';
} else {
$sentenceType = 'normal';
}
return "Sentence is {$sentenceType}";
}
print_r(getTypeOfSentence('Who?') . "\n"); // => Sentence is normal
print_r(getTypeOfSentence('No') . "\n"); // => Sentence is normal
print_r(getTypeOfSentence('No!') . "\n"); // => Sentence is exclamationМы добавили проверку восклицательных предложений (exclamation переводится «восклицание»). Технически эта функция работает, но вопросительные предложения трактует неверно. Еще в ней есть проблемы с точки зрения семантики. Наличие восклицательного знака проверяется в любом случае, даже если уже обнаружился вопросительный знак. Ветка else описана для второго условия, но не для первого. Поэтому вопросительное предложение становится normal.
Чтобы исправить ситуацию, воспользуемся еще одной возможностью условной конструкции:
<?php
function getTypeOfSentence(string $sentence): string
{
$lastChar = $sentence[-1];
if ($lastChar === '?') {
$sentenceType = 'question';
} elseif ($lastChar === '!') {
$sentenceType = 'exclamation';
} else {
$sentenceType = 'normal';
}
return "Sentence is {$sentenceType}";
}
print_r(getTypeOfSentence('Who?') . "\n"); // => Sentence is question
print_r(getTypeOfSentence('No') . "\n"); // => Sentence is normal
print_r(getTypeOfSentence('No!') . "\n"); // => Sentence is exclamationТеперь все условия выстроились в единую конструкцию. Ключевое слово elseif означает «если не выполнено предыдущее условие, но выполнено текущее».
┌─────────────────┐
│ условие 1? │
└────┬────────┬───┘
true │ │ false
↓ ↓
┌──────────┐ ┌─────────────────┐
│ тело if │ │ условие 2? │
└──────────┘ └────┬────────┬───┘
true │ │ false
↓ ↓
┌────────────┐ ┌──────────┐
│тело elseif │ │ тело else│
└────────────┘ └──────────┘Логика функции устроена так. Если последний символ ?, возвращается 'question'. Если последний символ !, возвращается 'exclamation'. Во всех остальных случаях возвращается 'normal'.
Выполнится только один из блоков кода, который относится ко всей конструкции if.
Задание
Реализуйте функцию getTrafficLightAction(), которая принимает цвет светофора и возвращает, что нужно делать водителю.
Правила:
'green'→'go''yellow'→'slow down''red'→'stop'- Любой другой цвет →
'unknown'
Примеры вызова:
<?php
getTrafficLightAction('green'); // 'go'
getTrafficLightAction('red'); // 'stop'
getTrafficLightAction('purple'); // 'unknown'Ваше упражнение проверяется по этим тестам
<?php
namespace HexletBasics\Conditionals\ElseIfStatement;
use HexletBasics\Exercise\TestCase;
class SolutionTest extends TestCase
{
public function test()
{
$this->assertEquals('go', getTrafficLightAction('green'));
$this->assertEquals('slow down', getTrafficLightAction('yellow'));
$this->assertEquals('stop', getTrafficLightAction('red'));
$this->assertEquals('unknown', getTrafficLightAction('blue'));
$this->assertEquals('unknown', getTrafficLightAction('purple'));
}
}Решение учителя откроется через:
20:00
