Основы возврата значений функций

Раздел: Основы функций -> Возврат значений

Функции в PHP могут возвращать значения, что позволяет использовать результат их работы в других частях кода. Основной механизм - инструкция return. Кроме того, существуют альтернативные подходы для специфических ситуаций.

Основные подходы к получению возвращаемого значения

Как получить результат работы функции с помощью return?

Инструкция return завершает выполнение функции и передает указанное значение вызывающему коду. Если return не указан, функция возвращает null. Это самый распространенный и эффективный способ возврата единичного значения.


function sum($a, $b) {
    return $a + $b;
}
$result = sum(3, 4);
echo $result; // 7

Php get return (получение возвращаемого значения в php)

Цель использования: получение одного значения (числа, строки, массива, объекта) из функции. Применяется в подавляющем большинстве случаев.

Типичные ошибки:

  • Отсутствие return - функция возвращает null.
  • Несколько return в одной функции - выполняется первый встреченный.
  • Возврат неопределенной переменной - вызывает предупреждение.

Решение:

  • Всегда явно указывать return для возвращаемых значений.
  • Проверять наличие переменных перед возвратом, использовать объединение типов (?int и т.п.).

Как вернуть переменную из функции по ссылке?

С помощью &return можно вернуть ссылку на переменную, а не её копию. Это полезно для экономии памяти при работе с большими массивами или для изменения исходной переменной извне.


function &getValue(&$ref) {
    return $ref;
}
$data = 10;
$result =& getValue($data);
$result = 20;
echo $data; // 20

Цель использования: когда нужно модифицировать исходную переменную через результат функции.

Проблемы:

  • Можно случайно изменить исходные данные.
  • Необходимо указывать & как в объявлении функции, так и при присваивании ($result =& function()).
  • Попытка вернуть локальную переменную по ссылке приведёт к предупреждению.

Как вернуть из функции несколько значений?

PHP не поддерживает множественное возвращение напрямую. Вместо этого используется массив или объект для упаковки нескольких значений.

Вариант с массивом:


function getCoordinates() {
    return [10, 20];
}
list($x, $y) = getCoordinates();
echo "x=$x, y=$y"; // x=10, y=20

Вариант с ассоциативным массивом:


function getStats() {
    return ['min' => 1, 'max' => 100];
}
$stats = getStats();
echo $stats['max']; // 100

Цель использования: возврат нескольких связанных значений (например, координаты, настройки).

Проблемы:

  • Неочевидная структура возвращаемого массива при отсутствии документации.
  • Необходимость помнить порядок или ключи массива.

Как вернуть структурированные данные с помощью объекта?

Использование объекта - более гибкий способ: можно вернуть экземпляр класса с полями и методами.


class Point {
    public $x, $y;
    public function __construct($x, $y) {
        $this->x = $x;
        $this->y = $y;
    }
}
function createPoint($x, $y) {
    return new Point($x, $y);
}
$p = createPoint(3, 5);
echo $p->x; // 3

Цель использования: возврат логически связанных данных с инкапсуляцией.

Проблемы:

  • Больше кода на создание класса.
  • Изменение структуры объекта может затронуть вызывающий код.

Что возвращает функция без инструкции return?

Если в функции нет return, она неявно возвращает null. Это справедливо и для пустого return;.


function doNothing() {
    // код без return
}
var_dump(doNothing()); // NULL

Цель использования: функции, выполняющие побочные действия (вывод данных, запись в БД) без возврата.

Проблемы:

  • Неожиданное получение null при попытке использовать результат.
  • Путаница между функциями, возвращающими значение, и процедурами.

Как вернуть последовательность значений по требованию (генератор)?

Генераторы используют yield для возврата каждого значения по одному, не создавая полный массив в памяти. Это эффективно для больших наборов данных.


function getRange($start, $end) {
    for ($i = $start; $i <= $end; $i++) {
        yield $i;
    }
}
foreach (getRange(1, 3) as $value) {
    echo $value; // 1 2 3
}

Цель использования: поточная обработка данных, работа с большими файлами, бесконечные последовательности.

Проблемы:

  • Нельзя получить все значения сразу без цикла.
  • Генератор можно обойти только один раз.
  • Ошибки при использовании return вместе с yield (требуется PHP 7.0+).

Как получить результат из анонимной функции (замыкания)?

Анонимные функции также могут возвращать значения через return. Их можно передавать как callback или сохранять в переменную.


$multiplier = function($factor) {
    return function($value) use ($factor) {
        return $value * $factor;
    };
};
$double = $multiplier(2);
echo $double(5); // 10

Цель использования: создание замыканий для каррирования, фабрик функций, обратных вызовов.

Проблемы:

  • Неправильное использование use для захвата переменных.
  • Сложности с отладкой.

Рекурсия, замыкания, генераторы и ссылочный возврат: подробные примеры

Рекурсивный возврат факториала

Функция вызывает саму себя до достижения базового случая. Возвращаемое значение накапливается.

Пример

function factorial($n) {
    if ($n <= 1) {
        return 1;
    }
    return $n * factorial($n - 1);
}
echo factorial(5); // 120
120

Замыкание с возвратом суммы и её использование

Анонимная функция принимает массив и возвращает сумму элементов. Замыкание захватывает внешнюю переменную-множитель.

Пример

$factor = 2;
$sumWithFactor = function($numbers) use ($factor) {
    $sum = array_sum($numbers);
    return $sum * $factor;
};
echo $sumWithFactor([1, 2, 3]); // 12
12

Генератор чисел Фибоначчи с return для последнего значения

В PHP 7+ генератор может использовать return для финального значения, которое получается через getReturn() после окончания итераций.

Пример

function fibonacci($n) {
    $a = 0;
    $b = 1;
    for ($i = 0; $i < $n; $i++) {
        yield $a;
        $tmp = $a + $b;
        $a = $b;
        $b = $tmp;
    }
    return $a;
}
$gen = fibonacci(6);
foreach ($gen as $val) {
    echo $val . " "; // 0 1 1 2 3 5
}
echo "\nLast: " . $gen->getReturn(); // Last: 8
0 1 1 2 3 5
Last: 8

Возврат по ссылке для модификации элемента массива

Функция возвращает ссылку на элемент массива, что позволяет изменить его напрямую.

Пример

function &getElement(array &$arr, $key) {
    return $arr[$key];
}
$data = ['a' => 10, 'b' => 20];
$ref =& getElement($data, 'a');
$ref = 99;
print_r($data); // Array ( [a] => 99 [b] => 20 )
Array
(
    [a] => 99
    [b] => 20
)

Возврат значений через список присваивания (destructuring)

С PHP 7.1 можно использовать синтаксис [$a, $b] = function().

Пример

function minMax($arr) {
    return [min($arr), max($arr)];
}
[$min, $max] = minMax([3, -1, 8, 5]);
echo "min=$min, max=$max"; // min=-1, max=8
min=-1, max=8

Возврат значения с типизацией и объединенными типами

Функция может объявлять возвращаемый тип, что предотвращает неправильное использование.

Пример

function findUser($id): ?array {
    $users = [1 => ['name' => 'Alice'], 2 => ['name' => 'Bob']];
    return $users[$id] ?? null;
}
$user = findUser(1);
var_dump($user); // array(1) { ["name"]=> string(5) "Alice" }
$user = findUser(99);
var_dump($user); // NULL
array(1) {
  ["name"]=>
  string(5) "Alice"
}
NULL

Получение возвращаемого значения в PHP - comments

En
Php get return (php)