Возврат значений
Значения возвращаются при помощи необязательного оператора возврата. Возвращаемые значения могут быть любого типа, в том числе это могут быть массивы и объекты. Возврат приводит к завершению выполнения функции и передаче управления обратно к той строке кода, в которой данная функция была вызвана. Для получения более детальной информации ознакомьтесь с описанием return.
Замечание:
Если конструкция return не указана, то функция вернет значение
NULL
.
Использование выражения return
Пример #1 Использование конструкции return
<?php
function square($num)
{
return $num * $num;
}
echo square(4); // выводит '16'.
?>
Функция не может возвращать несколько значений, но аналогичного результата можно добиться, возвращая массив.
Пример #2 Возврат нескольких значений в виде массива
<?php
function small_numbers()
{
return array (0, 1, 2);
}
list ($zero, $one, $two) = small_numbers();
?>
Для того, чтобы функция возвращала результат по ссылке, вам необходимо использовать оператор & и при описании функции, и при присвоении переменной возвращаемого значения:
Пример #3 Возврат результата по ссылке
<?php
function &returns_reference()
{
return $someref;
}
$newref =& returns_reference();
?>
Для получения более детальной информации о ссылках обратитесь к разделу документации Подробно о ссылках.
Объявление типов возвращаемых значений
В PHP 7 добавлена возможность объявлять тип возвращаемого значения. Аналогично объявлению типов аргументов можно задать тип значения, которое будет возвращаться функцией. Типы, которые можно объявить для возвращаемых значений те же, что и для аргументов фукнций.
Режим строгой типизации также работает для объявлении типа возвращаемого значения. В обычном режиме слабой типизации возвращаемое из функции значение приводится к корректному типу. При строгой типизации возвращаемое значение должно быть заданного типа, иначе будет выброшено исключение TypeError.
Замечание:
Если переопределяется родительский метод, возвращаемое значение дочернего метода должно быть того же типа, что и родительского. Если в родительском методе не задан тип возвращаемого значения, то и дочерний метод этот тип может не объявлять.
Примеры
Пример #4 Обычное объявление типа возвращаемого значения
<?php
function sum($a, $b): float {
return $a + $b;
}
// Будет возвращаться значение типа float.
var_dump(sum(1, 2));
?>
Результат выполнения данного примера:
float(3)
Пример #5 То же в режиме строгой типизации
<?php
declare(strict_types=1);
function sum($a, $b): int {
return $a + $b;
}
var_dump(sum(1, 2));
var_dump(sum(1, 2.5));
?>
Результат выполнения данного примера:
int(3) Fatal error: Uncaught TypeError: Return value of sum() must be of the type integer, float returned in - on line 5 in -:5 Stack trace: #0 -(9): sum(1, 2.5) #1 {main} thrown in - on line 5
Пример #6 Возврат объектов
<?php
class C {}
function getC(): C {
return new C;
}
var_dump(getC());
?>
Результат выполнения данного примера:
object(C)#1 (0) { }
Коментарии
Functions which return references, may return a NULL value. This is inconsistent with the fact that function parameters passed by reference can't be passed as NULL (or in fact anything which isnt a variable).
i.e.
<?php
function &testRet()
{
return NULL;
}
if (testRet() === NULL)
{
echo "NULL";
}
?>
parses fine and echoes NULL
Be careful about using "do this thing or die()" logic in your return lines. It doesn't work as you'd expect:
<?php
function myfunc1() {
return('thingy' or die('otherthingy'));
}
function myfunc2() {
return 'thingy' or die('otherthingy');
}
function myfunc3() {
return('thingy') or die('otherthingy');
}
function myfunc4() {
return 'thingy' or 'otherthingy';
}
function myfunc5() {
$x = 'thingy' or 'otherthingy'; return $x;
}
echo myfunc1(). "\n". myfunc2(). "\n". myfunc3(). "\n". myfunc4(). "\n". myfunc5(). "\n";
?>
Only myfunc5() returns 'thingy' - the rest return 1.
Developers with a C background may expect pass by reference semantics for arrays. It may be surprising that pass by value is used for arrays just like scalars. Objects are implicitly passed by reference.
<?php
# (1) Objects are always passed by reference and returned by reference
class Obj {
public $x;
}
function obj_inc_x($obj) {
$obj->x++;
return $obj;
}
$obj = new Obj();
$obj->x = 1;
$obj2 = obj_inc_x($obj);
obj_inc_x($obj2);
print $obj->x . ', ' . $obj2->x . "\n";
# (2) Scalars are not passed by reference or returned as such
function scalar_inc_x($x) {
$x++;
return $x;
}
$x = 1;
$x2 = scalar_inc_x($x);
scalar_inc_x($x2);
print $x . ', ' . $x2 . "\n";
# (3) You have to force pass by reference and return by reference on scalars
function &scalar_ref_inc_x(&$x) {
$x++;
return $x;
}
$x = 1;
$x2 =& scalar_ref_inc_x($x); # Need reference here as well as the function sig
scalar_ref_inc_x($x2);
print $x . ', ' . $x2 . "\n";
# (4) Arrays use pass by value sematics just like scalars
function array_inc_x($array) {
$array{'x'}++;
return $array;
}
$array = array();
$array['x'] = 1;
$array2 = array_inc_x($array);
array_inc_x($array2);
print $array['x'] . ', ' . $array2['x'] . "\n";
# (5) You have to force pass by reference and return by reference on arrays
function &array_ref_inc_x(&$array) {
$array{'x'}++;
return $array;
}
$array = array();
$array['x'] = 1;
$array2 =& array_ref_inc_x($array); # Need reference here as well as the function sig
array_ref_inc_x($array2);
print $array['x'] . ', ' . $array2['x'] . "\n";
PHP 7.1 allows for void and null return types by preceding the type declaration with a ? -- (e.g. function canReturnNullorString(): ?string)
However resource is not allowed as a return type:
<?php
function fileOpen(string $fileName, string $mode): resource
{
$handle = fopen($fileName, $mode);
if ($handle !== false)
{
return $handle;
}
}
$resourceHandle = fileOpen("myfile.txt", "r");
?>
Errors with:
Fatal error: Uncaught TypeError: Return value of fileOpen() must be an instance of resource, resource returned.