PHP 8.4.0 RC4 available for testing

Возврат значений

Значения возвращаются необязательной инструкцией возврата. Разрешается возвращать любой тип, включая массивы и объекты. Возврат немедленно завершает выполнение функции и передаёт управление обратно — к той строке кода, в которой вызвали функцию. Подробную информацию о возврате значений даёт описание инструкции return.

Замечание:

Функция вернёт значение null, если инструкцию return не указали.

Инструкция return

Пример #1 Пример функции с инструкцией return

<?php

function square($num)
{
return
$num * $num;
}

echo
square(4); // Выводит 16

?>

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

Пример #2 Возврат набора значений в виде массива

<?php

function small_numbers()
{
return [
0, 1, 2];
}

// Деструктуризация массива будет собирать каждый элемент массива индивидуально
[$zero, $one, $two] = small_numbers();

// До версии 7.1.0 единственной эквивалентной альтернативой была языковая конструкция list()
list($zero, $one, $two) = small_numbers();

?>

Оператор & указывают и в описании функции, и в момент присваивания возвращаемого значения переменной, чтобы функция возвращала результат по ссылке:

Пример #3 Возврат результата по ссылке

<?php

function &returns_reference()
{
return
$someref;
}

$newref =& returns_reference();

?>

Дополнительную информацию о ссылках даёт раздел документации «Объяснение ссылок».

Добавить

Примечания пользователей 4 notes

up
24
rstaveley at seseit dot com
14 years ago
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";
up
23
ryan dot jentzsch at gmail dot com
7 years ago
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.
up
13
bgalloway at citycarshare dot org
16 years ago
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.
up
7
nick at itomic.com
21 years ago
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
To Top