Инструкция return в PHP

Пусть у нас есть функция, которая выводит на экран квадрат переданного числа:

<?php function func($num) { echo $num * $num; } func(3); // выведет 9 ?>

Пусть мы хотим не выводить значение на экран, а записать в какую-нибудь переменную, вот так:

<?php $result = func(3); // в переменной $result теперь 9 ?>

Для этого в PHP существует специальная инструкция return, которая позволяет указать значение, которое возвращает функция. Под словом возвращает понимают то значение, которое запишется в переменную, если ей присвоить вызванную функцию.

Итак, давайте перепишем нашу функцию так, чтобы она не выводила результат на экран, а возвращала его в переменную:

<?php function func($num) { return $num * $num; } $result = func(3); // в переменной $result теперь 9 ?>

После того, как данные записаны в переменную, их можно, например, вывести на экран:

<?php function func($num) { return $num * $num; } $result = func(3); echo $result; // выведет 9 ?>

А можно сначала как-то изменить эти данные, а затем вывести их на экран:

<?php function func($num) { return $num * $num; } $result = func(3); $result = $result + 1; echo $result; // выведет 10 ?>

Можно сразу выполнять какие-то действия с результатом работы функции перед записью в переменную:

<?php function func($num) { return $num * $num; } $result = func(3) + 1; echo $result; // выведет 10 ?>

А можно не записывать результат в переменную, а сразу вывести его на экран:

<?php function func($num) { return $num * $num; } echo func(3); // выведет 9 ?>

Сделайте функцию, которая параметром принимает число, а возвращает куб этого числа. С помощью этой функции найдите куб числа 3 и запишите его в переменную $result.

Использование функций в выражении

В следующем примере с помощью функции func мы сначала найдем квадрат числа 2, а затем - квадрат числа 3, сложим эти значения и запишем в переменную:

<?php function func($num) { return $num * $num; } $result = func(2) + func(3); echo $result; // выведет 13 ?>

Сделайте функцию, которая параметром принимает число, а возвращает квадратный корень из этого числа. С помощью этой функции найдите корень числа 3, затем найдите корень числа 4. Просуммируйте полученные результаты и выведите их на экран.

Функции в функциях

Можно также результат работы одной функции передать параметром в другую, например, вот так мы сначала найдем квадрат числа 2, а затем квадрат результата:

<?php function func($num) { return $num * $num; } $result = func(func(2)); echo $result; // выведет 16 ?>

Функции, конечно же, не обязательно должны быть одинаковыми.

Пусть, например, у нас есть функция, возвращающая квадрат числа, и функция, возвращающая куб числа:

<?php function square($num) { return $num * $num; } function cube($num) { return $num * $num * $num; } ?>

Давайте с помощью этих функций возведем число 2 в квадрат, а затем результат этой операции возведем в куб:

<?php $result = cube(square(2)); echo $result; ?>

Пусть теперь у нас есть функция, возвращающая квадрат числа, и функция, находящая сумму двух чисел:

<?php function square($num) { return $num * $num; } function sum($num1, $num2) { return $num1 + $num2; } ?>

Найдем с помощью этих функций сумму квадрата числа 2 и сумму квадрата числа 3:

<?php $result = sum(square(2), square(3)); echo $result; ?>

Тонкое место return

После того, как выполнится инструкция return - функция закончит свою работу. То есть: после выполнения return больше никакой код не выполнится.

Смотрите пример:

<?php function func($num) { return $num * $num; echo '!'; // этот код никогда не выполнится } $result = func(3); ?>

Это не значит, что в функции должен быть один return. Но выполнится только один из них.

В следующем примере в зависимости от значения параметра выполнится либо первый, либо второй return:

<?php function func($num) { if ($num >= 0) { return '+'; } else { return '-'; } } echo func( 3); // выведет '+' echo func(-3); // выведет '-' ?>

Что выведется на экран в результате выполнения следующего кода:

<?php function func($num) { return $num; $result = $num * $num; return $result; } echo func(3); ?>

Объясните почему.

Что выведет каждый из echo в результате выполнения следующего кода:

<?php function func($num) { if ($num <= 0) { return abs($num); } else { return $num * $num; } } echo func(10); echo func(-5); ?>

Объясните почему.

Что выведет каждый из echo в результате выполнения следующего кода:

<?php function func($num) { if ($num <= 0) { return abs($num); } return $num * $num; } echo func(10); echo func(-5); ?>

Объясните почему.

Цикл и return

Пусть у нас есть функция, возвращающая сумму чисел от 1 до 5:

<?php function func() { $sum = 0; for ($i = 1; $i <= 5; $i++) { $sum += $i; } return $sum; } $result = func(); echo $result; // выведет 15 ?>

Пусть теперь мы расположим return внутри цикла, вот так:

<?php function func() { $sum = 0; for ($i = 1; $i <= 5; $i++) { $sum += $i; return $sum; } } $result = func(); echo $result; ?>

В этом случае цикл прокрутится лишь одну итерацию и произойдет автоматический выход из функции (ну и заодно из цикла). А за одну итерацию цикла в переменной $sum окажется лишь число 1, а не вся нужная сумма.

Что выведется на экран в результате выполнения следующего кода:

<?php function func($num) { $sum = 0; for ($i = 1; $i <= $num; $i++) { $sum += $i; return $sum; } } echo func(5); ?>

Объясните почему.

Что хотел сделать автор данного кода? Исправьте ошибку автора.

Применение return в цикле

То, что return расположен внутри цикла, не всегда может быть ошибкой.

В следующем примере сделана функция, которая определяет, сколько первых элементов массива нужно сложить, чтобы сумма стала больше или равна 10:

<?php function func($arr) { $length = count($arr); $sum = 0; for ($i = 0; $i < $length; $i++) { $sum += $arr[$i]; // Если сумма больше или равна 10: if ($sum >= 10) { return $i + 1; // выходим из цикла и из функции } } } $result = func([1, 2, 3, 4, 5]); echo $result; ?>

А в следующем примере сделана функция, которая вычисляет, сколько целых чисел, начиная с 1, нужно сложить, чтобы результат был больше 100:

<?php function func() { $sum = 0; $i = 1; while (true) { // бесконечный цикл $sum += $i; if ($sum >= 100) { return $i; // цикл крутится пока не выйдет тут } $i++; } } echo func( ); ?>

Напишите функцию, которая параметром будет принимать число и делить его на 2 столько раз, пока результат не станет меньше 10. Пусть функция возвращает количество итераций, которое потребовалось для достижения результата.

Приемы работы с return

Существуют некоторые приемы работы с return, упрощающие код.

Рассмотрим, к примеру, следующий код:

<?php function func($num) { if ($num >= 0) { $result = sqrt($num); } else { $result = 0; } return $result; } echo func(3); ?>

Как вы видите, в данном коде в зависимости от условия в переменную $result будет попадать либо одно, либо другое значение. А последней строкой функции содержимое этой переменной возвращается через return.

Давайте перепишем этот код в более сокращенной форме, избавившись от ненужной здесь переменной $result:

<?php function func($num) { if ($num >= 0) { return sqrt($num); } else { return 0; } } echo func(3); ?>

Дана следующая функция:

<?php function func($num1, $num2) { if ($num1 > 0 and $num2 > 0) { $result = $num1 * $num2; } else { $result = $num1 - $num2; } return $result; } echo func(3, 4); ?>

Перепишите ее в сокращенной форме согласно изученной теории.