PHP: else
Посмотрите на функцию ниже. Она определяет тип предложения по последнему символу: если предложение заканчивается вопросительным знаком, функция вернет Sentence is question, иначе — Sentence is normal:
<?php
function getTypeOfSentence(string $sentence): string
{
$lastChar = $sentence[-1];
if ($lastChar === '?') {
$sentenceType = 'question';
} else {
$sentenceType = 'normal';
}
return "Sentence is {$sentenceType}";
}
print_r(getTypeOfSentence('Hodor') . "\n"); // => Sentence is normal
print_r(getTypeOfSentence('Hodor?') . "\n"); // => Sentence is questionМы добавили else и новый блок в фигурных скобках. Он выполнится, если условие в if окажется ложным. Еще в блок else можно вкладывать другие условия if. Else переводится «иначе», «в ином случае».
┌───────────┐
│ условие? │
└─────┬─────┘
true │ │ false
↓ ↓
┌──────────┐ ┌──────────┐
│ тело if │ │ тело else│
└──────────┘ └──────────┘Пример вложенных блоков:
<?php
$number = 10;
if ($number > 10) {
print_r('Number is greater than 10');
} else {
if ($number === 10) {
print_r('Number is exactly 10');
} else {
print_r('Number is less than 10');
}
}Оформить конструкцию if-else можно двумя способами. С помощью отрицания !== можно изменить порядок блоков:
<?php
function getTypeOfSentence(string $sentence): string
{
$lastChar = $sentence[-1];
if ($lastChar !== '?') {
$sentenceType = 'normal';
} else {
$sentenceType = 'question';
}
return "Sentence is {$sentenceType}";
}Чтобы конструкцию было легче оформлять, старайтесь выбирать проверку без отрицаний и подстраивайте содержимое блоков под нее.
На примере использования else видно, как важно следить за тем, к какому if относится каждый блок:
<?php
// Неправильно
function checkNumber(int $number): void
{
if ($number > 0) {
print_r("Число положительное\n");
}
if ($number > 10) {
print_r("Число больше 10\n");
} else {
print_r("Число не положительное\n");
}
}
checkNumber(3);
// => Число положительное
// => Число не положительноеВ примере выше мы забыли вложить второй if внутрь первого, поэтому else теперь относится ко второму if. Программа сообщает, что число одновременно положительное и не положительное.
<?php
// Правильно
function checkNumber(int $number): void
{
if ($number > 0) {
print_r("Число положительное\n");
if ($number > 10) {
print_r("Число больше 10\n");
}
} else {
print_r("Число не положительное\n");
}
}
checkNumber(3);
// => Число положительноеТеперь второй if вложен в первый, а else на одном уровне с первым и противопоставляется ему.
Задание
Реализуйте функцию normalizeUrl(), которая выполняет нормализацию данных. Она принимает адрес сайта и возвращает его с https:// в начале.
Функция принимает адреса в виде АДРЕС или http://АДРЕС, но всегда возвращает адрес в виде https://АДРЕС. На вход функции также может поступить адрес в уже нормализованном виде https://АДРЕС, в этом случае ничего менять не надо.
Примеры вызова:
<?php
normalizeUrl('https://ya.ru'); // 'https://ya.ru'
normalizeUrl('google.com'); // 'https://google.com'
normalizeUrl('http://ai.fi'); // 'https://ai.fi'Есть несколько способов решить задачу. Один из них — проверить с помощью функции str_starts_with(), начинается ли строка-аргумент со строки http://, а потом на основе этого добавлять или не добавлять к ней https://.
Также вам скорее всего потребуется отбросить ненужную часть в начале строки. Помните, мы рассматривали способ получения кусочка от строки с помощью функции substr()? Если нет, напоминаю:
<?php
// Берем 2 символа от начала
print_r(substr('python', 0, 2)); // => pyТак вот, с помощью substr() можно также отбросить определенное количество символов:
<?php
// Отбрасываем первые 2 символа
print_r(substr('python', 2)); // => thonPHP: else
Посмотрите на функцию ниже. Она определяет тип предложения по последнему символу: если предложение заканчивается вопросительным знаком, функция вернет Sentence is question, иначе — Sentence is normal:
<?php
function getTypeOfSentence(string $sentence): string
{
$lastChar = $sentence[-1];
if ($lastChar === '?') {
$sentenceType = 'question';
} else {
$sentenceType = 'normal';
}
return "Sentence is {$sentenceType}";
}
print_r(getTypeOfSentence('Hodor') . "\n"); // => Sentence is normal
print_r(getTypeOfSentence('Hodor?') . "\n"); // => Sentence is questionМы добавили else и новый блок в фигурных скобках. Он выполнится, если условие в if окажется ложным. Еще в блок else можно вкладывать другие условия if. Else переводится «иначе», «в ином случае».
┌───────────┐
│ условие? │
└─────┬─────┘
true │ │ false
↓ ↓
┌──────────┐ ┌──────────┐
│ тело if │ │ тело else│
└──────────┘ └──────────┘Пример вложенных блоков:
<?php
$number = 10;
if ($number > 10) {
print_r('Number is greater than 10');
} else {
if ($number === 10) {
print_r('Number is exactly 10');
} else {
print_r('Number is less than 10');
}
}Оформить конструкцию if-else можно двумя способами. С помощью отрицания !== можно изменить порядок блоков:
<?php
function getTypeOfSentence(string $sentence): string
{
$lastChar = $sentence[-1];
if ($lastChar !== '?') {
$sentenceType = 'normal';
} else {
$sentenceType = 'question';
}
return "Sentence is {$sentenceType}";
}Чтобы конструкцию было легче оформлять, старайтесь выбирать проверку без отрицаний и подстраивайте содержимое блоков под нее.
На примере использования else видно, как важно следить за тем, к какому if относится каждый блок:
<?php
// Неправильно
function checkNumber(int $number): void
{
if ($number > 0) {
print_r("Число положительное\n");
}
if ($number > 10) {
print_r("Число больше 10\n");
} else {
print_r("Число не положительное\n");
}
}
checkNumber(3);
// => Число положительное
// => Число не положительноеВ примере выше мы забыли вложить второй if внутрь первого, поэтому else теперь относится ко второму if. Программа сообщает, что число одновременно положительное и не положительное.
<?php
// Правильно
function checkNumber(int $number): void
{
if ($number > 0) {
print_r("Число положительное\n");
if ($number > 10) {
print_r("Число больше 10\n");
}
} else {
print_r("Число не положительное\n");
}
}
checkNumber(3);
// => Число положительноеТеперь второй if вложен в первый, а else на одном уровне с первым и противопоставляется ему.
Задание
Реализуйте функцию normalizeUrl(), которая выполняет нормализацию данных. Она принимает адрес сайта и возвращает его с https:// в начале.
Функция принимает адреса в виде АДРЕС или http://АДРЕС, но всегда возвращает адрес в виде https://АДРЕС. На вход функции также может поступить адрес в уже нормализованном виде https://АДРЕС, в этом случае ничего менять не надо.
Примеры вызова:
<?php
normalizeUrl('https://ya.ru'); // 'https://ya.ru'
normalizeUrl('google.com'); // 'https://google.com'
normalizeUrl('http://ai.fi'); // 'https://ai.fi'Есть несколько способов решить задачу. Один из них — проверить с помощью функции str_starts_with(), начинается ли строка-аргумент со строки http://, а потом на основе этого добавлять или не добавлять к ней https://.
Также вам скорее всего потребуется отбросить ненужную часть в начале строки. Помните, мы рассматривали способ получения кусочка от строки с помощью функции substr()? Если нет, напоминаю:
<?php
// Берем 2 символа от начала
print_r(substr('python', 0, 2)); // => pyТак вот, с помощью substr() можно также отбросить определенное количество символов:
<?php
// Отбрасываем первые 2 символа
print_r(substr('python', 2)); // => thonВаше упражнение проверяется по этим тестам
<?php
namespace HexletBasics\Conditionals\IfElse;
use HexletBasics\Exercise\TestCase;
class SolutionTest extends TestCase
{
public function test()
{
$this->assertEquals('https://yandex.ru', normalizeUrl('yandex.ru'));
$this->assertEquals('https://yandex.ru', normalizeUrl('http://yandex.ru'));
$this->assertEquals('https://yandex.ru', normalizeUrl('https://yandex.ru'));
$this->assertEquals('https://httpsecurity.com', normalizeUrl('httpsecurity.com'));
$this->assertEquals(
'https://httpbin.org/redirect-to?url=http://google.com',
normalizeUrl('https://httpbin.org/redirect-to?url=http://google.com')
);
$this->assertEquals(
'https://httpbin.org/redirect-to?url=https://google.com',
normalizeUrl('httpbin.org/redirect-to?url=https://google.com')
);
$this->assertEquals(
'https://httpbin.org/redirect-to?url=http://google.com',
normalizeUrl('httpbin.org/redirect-to?url=http://google.com')
);
}
}Решение учителя откроется через:
20:00
