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

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

Замечание:

Если конструкция return не указана, то функция вернет значение NULL.

Использование выражения return

Пример #1 Использование конструкции return

<?php
function square($num)
{
    return 
$num $num;
}
echo 
square(4);   // выводит '16'.
?>

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

Пример #2 Возврат нескольких значений в виде массива

<?php
function small_numbers()
{
    return array (
012);
}
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(12));
?>

Результат выполнения данного примера:

float(3)

Пример #5 То же в режиме строгой типизации

<?php
declare(strict_types=1);

function 
sum($a$b): int {
    return 
$a $b;
}

var_dump(sum(12));
var_dump(sum(12.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 {}

function 
getC(): {
    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
2003-08-04 03:56:43
http://php5.kiev.ua/manual/ru/functions.returning-values.html
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.
2008-03-27 20:27:13
http://php5.kiev.ua/manual/ru/functions.returning-values.html
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->1;

$obj2 obj_inc_x($obj);
obj_inc_x($obj2);

print 
$obj->', ' $obj2->"\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";
2010-08-29 16:26:43
http://php5.kiev.ua/manual/ru/functions.returning-values.html
PHP 7 return types if specified can not return a null.
For example:
<?php
declare(strict_types=1);

function 
add2ints(int $xint $y):int
{
   
$z $x $y;
    if (
$z===0)
    {
        return 
null;
    }
    return 
$z;
}
$a add2ints(34);
echo 
is_null($a) ? 'Null' $a;
$b add2ints(-22);
echo 
is_null($b) ? 'Null' $b;
exit();

Output:
7
Process finished with 
exit code 139
2015-08-30 09:12:49
http://php5.kiev.ua/manual/ru/functions.returning-values.html
Note: the function does not have "alternative syntax" as if/endif, while/endwhile, and colon (:) here is used to define returning type and not to mark where the block statement begins.
2016-04-17 13:58:47
http://php5.kiev.ua/manual/ru/functions.returning-values.html
Автор:
With 7.1, these are possible yet;

<?php
function ret_void(): void {
   
// do something but no return any value
    // if needs to break fn exec for any reason simply write return;
   
if (...) {
        return; 
// break
        // return null; // even this NO!
   
}

   
$db->doSomething();
   
// no need return call anymore 
}

function 
ret_nullable() ?int {
    if (...) {
        return 
123;
    } else {
        return 
null// MUST!
   
}
}
?>
2016-12-20 00:50:53
http://php5.kiev.ua/manual/ru/functions.returning-values.html
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 $fileNamestring $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.
2017-01-02 20:40:29
http://php5.kiev.ua/manual/ru/functions.returning-values.html
You may specify child return type if there is no parent:

<?php

class {
    public function 
($a)
    {
        return 
1;
    }
}

class 
extends {
    public function 
($a): int // + return type, OK
   
{
        return 
1;
    }
}

class 
extends {
    public function 
(int $a// + argument type, WARNING
   
{
        return 
1;
    }
}
?>
2018-02-26 17:54:25
http://php5.kiev.ua/manual/ru/functions.returning-values.html
Автор:
Be careful when introducing return types to your code.

Only one return type can be specified (but prefacing with ? allows null).

Return values of a type different to that specified are silently converted with sometimes perplexing results. These can be tedious to find and will need rewriting, along with calling code.

Declare strict types using "declare(strict_types=1);" and an error will be generated, saving much head-scratching.
2018-05-07 17:20:01
http://php5.kiev.ua/manual/ru/functions.returning-values.html
Автор:
Declaring a collection of objects as return type is not implemented and forbidden:
<?php
class Child{}

function 
getChilds(): Child[]
{
    return [(new 
Child()), (new Child())];
}

var_dump(getChilds());
// Returns:  Parse error: syntax error, unexpected '[', expecting '{'
?>

We have to use:
<?php
class Child{}

function 
getChilds(): array
{
    return [(new 
Child()), (new Child())];
}

var_dump(getChilds());
// Returns: 
/*
array (size=2)
  0 =>
    object(Child)[168]
  1 =>
    object(Child)[398]
*/
?>

Idem for function parameter:
<?php
function setChilds(Child[] $childs){}
// Not allowed

function setChilds(array $childs){}
// Allowed
?>
2019-10-21 11:40:25
http://php5.kiev.ua/manual/ru/functions.returning-values.html

    Поддержать сайт на родительском проекте КГБ