В этом уроке мы изучим три важных конструкции языка PHP — if, else и else if.
if
Задача предиката — получить ответ на вопрос, но обычно этого недостаточно и нужно выполнить определенное действие в зависимости от ответа.
Напишем функцию, которая определяет тип переданного предложения. Для начала она будет отличать обычные предложения от вопросительных:
<?php
function getTypeOfSentence($sentence)
{
// Простой способ извлечь последний символ
$lastChar = $sentence[-1];
if ($lastChar === '?') {
return 'question';
}
return 'normal';
}
getTypeOfSentence('Hodor'); // normal
getTypeOfSentence('Hodor?'); // question
if — это инструкция. В скобках ей передается выражение-предикат, а затем описывается блок кода в фигурных скобках. Этот блок кода будет выполнен, только если предикат — истина. Если предикат — ложь, то блок кода в фигурных скобках пропускается, и функция продолжает свое выполнение дальше.
В нашем случае следующая строчка кода — return 'normal';. Она заставит функцию вернуть строку и завершиться. Как видите, return может находиться где угодно в функции, в том числе — внутри блока кода с условием.
else
Попробуем изменить функцию из предыдущего примера так, чтобы она возвращала не просто тип предложения, а целую строку Sentence is normal или Sentence is question:
<?php
function getTypeOfSentence($sentence)
{
$lastChar = $sentence[-1];
if ($lastChar === '?') {
$sentenceType = 'question';
} else {
$sentenceType = 'normal';
}
return "Sentence is {$sentenceType}";
}
getTypeOfSentence('Hodor'); // Sentence is normal
getTypeOfSentence('Hodor?'); // Sentence is question
Мы добавили else и новый блок с фигурными скобками. Этот блок выполнится, только если условие в if — ложь.
Существует два способа оформления конструкции if-else. С помощью отрицания !== можно изменить порядок блоков:
<?php
function getTypeOfSentence($sentence)
{
$lastChar = $sentence[-1];
if ($lastChar !== '?') {
$sentenceType = 'normal';
} else {
$sentenceType = 'question';
}
return "Sentence is {$sentenceType}";
}
Какой способ предпочтительнее? Обычно людям проще мыслить прямолинейно, а не через отрицание. Старайтесь выбирать проверку без отрицаний и подстраивайте содержимое блоков под нее.
Конструкция else if
Функция getTypeOfSentence() различает только вопросительные и обычные предложения. Давайте попробуем добавить поддержку восклицательных предложений:
<?php
function getTypeOfSentence($sentence)
{
$lastChar = $sentence[-1];
if ($lastChar === '!') {
$sentenceType = 'exclamation';
} else {
$sentenceType = 'normal';
}
if ($lastChar === '?') {
$sentenceType = 'question';
}
return "Sentence is {$sentenceType}";
}
getTypeOfSentence('Who?'); // 'Sentence is question'
getTypeOfSentence('No'); // 'Sentence is normal'
getTypeOfSentence('No!'); // 'Sentence is exclamation'
Мы добавили еще одну проверку (exclamation переводится «восклицание»). Технически функция работает, но с точки зрения семантики есть проблемы:
- Проверка на наличие вопросительного знака происходит в любом случае, даже если уже был обнаружен восклицательный знак
- Ветка
elseописана именно для первого условия, но не для второго
Правильнее будет воспользоваться еще одной возможностью условной конструкции:
<?php
function getTypeOfSentence($sentence)
{
$lastChar = $sentence[-1];
if ($lastChar === '?') {
$sentenceType = 'question';
} elseif ($lastChar === '!') {
$sentenceType = 'exclamation';
} else {
$sentenceType = 'normal';
}
return "Sentence is {$sentenceType}";
}
Теперь все условия выстроены в единую конструкцию.
Конструкция elseif — это «если не выполнено предыдущее условие, но выполнено текущее». Получается такая схема:
- Если последний символ
?, то'question' - Иначе, если последний символ
!, то'exclamation' - Иначе
'normal'
Выполнится только один из блоков кода, относящихся ко всей конструкции if.