Функции, которые мы определяли в предыдущих уроках, заканчивали свою работу тем, что печатали на экран какие-то данные:
<?php
function greeting()
{
print_r('Hello, Hexlet!');
}
Пользы от таких функций не очень много, так как результатом их работы невозможно воспользоваться внутри программы. Чтобы это можно было сделать, нужно возвращать значение из функции, чему мы и научимся в этом уроке.
Рассмотрим задачу обработки электронной почты. Когда пользователь регистрируется на каком-то сайте, он может ввести email любым способом:
_support@hexlet.io__
SUPPORT@hexlet.io
Если мы сохраним email в таком виде в базу данных, то пользователь не сможет войти на сайт. Такое возможно, если он будет вбивать адрес без пробелов и в другом регистре.
Чтобы этого не произошло, email нужно подготовить к записи в базу. Его нужно привести к нижнему регистру и обрезать пробельные символы по краям строки. Такая задача решается в пару строчек:
<?php
function saveEmail()
{
$email = " SuppORT@hexlet.IO";
// Обрезаем пробельные символы
// Функция trim() удаляет пробелы из начала и конца строки
$trimmedEmail = trim($email);
$preparedEmail = strtolower($trimmedEmail);
print_r($preparedEmail);
// Здесь будет запись в базу данных
}
Этот код стал возможен только благодаря возврату значения. Функции trim()
и strtolower()
ничего не печатают на экран. Они возвращают результат своей работы, и поэтому мы можем записать его в переменные.
Если бы функции вместо возврата результата печатали на экран, мы бы не могли присвоить результат их работы переменной. Как мы не можем сделать с определенной выше функцией greeting()
:
<?php
$message = greeting();
// Чтобы увидеть null, нужно воспользоваться функцией var_dump()
var_dump($message); // => NULL
Изменим функцию greeting()
так, чтобы она начала возвращать данные вместо их печати. Для этого нам понадобится выполнить возврат вместо печати на экран:
<?php
function greeting()
{
return 'Hello, Hexlet!';
}
return
— особая инструкция, которая берет выражение, записанное справа. Далее она отдает его наружу тому коду, который вызвал метод. Как только PHP натыкается на return
, выполнение функции на этом завершается:
<?php
// Теперь мы можем использовать результат работы функции
$message = greeting();
print_r($message); // => 'Hello, Hexlet!'
// И даже выполнить какие-то действия над результатом
print_r(strtoupper($message)); // => 'HELLO, HEXLET!'
Любой код после return
не выполняется:
<?php
function greeting()
{
return 'Hello, Hexlet!';
print_r('Я никогда не выполнюсь');
}
Даже если функция возвращает данные, это не ограничивает ее в том, что она печатает. Кроме возврата данных мы можем и печатать:
<?php
function greeting()
{
print_r('Я появлюсь в консоли');
return 'Hello, Hexlet!';
}
// И напечатает текст на экран и вернет значение
$message = greeting();
Возвращать можно не только конкретное значение. Так как return
работает с выражениями, то справа от него может появиться почти всё что угодно. Здесь нужно руководствоваться принципами читаемости кода:
<?php
function greeting()
{
$message = 'Hello, Hexlet!';
return $message;
}
Здесь мы не возвращаем переменную. Всегда возвращается значение, которое находится в этой переменной. Ниже пример с вычислениями:
<?php
function doubleFive()
{
// или return 5 + 5
$result = 5 + 5;
return $result;
}
Вопрос на самопроверку. Что выведет этот код?
<?php
// Определение
function run()
{
// Возврат
return 5;
return 10;
}
// Использование
run(); // => ?
Реализуйте функцию sayHurrayThreeTimes()
, которая возвращает строку 'hurray! hurray! hurray!'.
$hurray = sayHurrayThreeTimes();
print_r($hurray); // => 'hurray! hurray! hurray!'
Вам не нужно вызывать свою функцию, только определить её.
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Ваше упражнение проверяется по этим тестам
1<?php
2
3namespace HexletBasics\DefineFunctions\ReturnInstruction;
4
5use PHPUnit\Framework\TestCase;
6
7class Test extends TestCase
8{
9 public function test()
10 {
11 require 'index.php';
12
13 $expected = 'hurray! hurray! hurray!';
14 assert(sayHurrayThreeTimes() === $expected);
15 }
16}
17
Решение учителя откроется через: