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

Значения возвращаются при помощи необязательного оператора возврата. Возвращаемые значения могут быть любого типа, в том числе это могут быть списки и объекты. Возврат приводит к завершению выполнения функции и передаче управления обратно к той строке кода, в которой данная функция была вызвана. Для получения более детальной информации ознакомьтесь с описанием функции 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();
?>

Для получения более детальной информации о ссылках обратитесь к разделу документации Подробно об указателях.

Коментарии

In reference to the poster above, an additional (better?) way to return multiple values from a function is to use list(). For example:

function fn($a, $b)
{
   # complex stuff

   return array(
      $a * $b,
      $a + $b,
   );
}

list($product, $sum) = fn(3, 4);

echo $product; # prints 12
echo $sum; # prints 7
2003-01-15 06:28:35
http://php5.kiev.ua/manual/ru/functions.returning-values.html
Автор:
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
Автор:
Just a quick clarification on whether variables are passed by reference or not. Variables are always passed using a pointer, and if the variable is modified, it is copied and re-assigned. For example:

<?php

function byPointer($x) {
    return 
$x 3// Does not modify or create a copy of $x
}

function 
copied($x) {
   
$x++; // At this point, creates a copy of $x to be used in local scope
   
return $x;
}

class 
Obj {
    public function 
performAction() {}
    public 
$y;
}

function 
objPointer(Obj $x) {
   
$x->performAction(); //works on $x
   
$x->'150'//works on $x
   
$x = new Obj(); // Does not modify $x outside of function
   
$x->'250';
}

function 
objReference(Obj &$x) {
   
$x->performAction(); //works on $x
   
$x->'150'//works on $x
   
$x = new Obj(); // Modifies original $x outside of function
   
$x->'250';
}

$x = new Obj();
$x->'10';

objPointer($x);

echo 
"Post Pointer: {$x->y}\n";

$x->'10';
objReference($x);

echo 
"Post Reference: {$x->y}\n";

?>

This will output:
Post Pointer: 150
Post Reference: 250

So make sure when writing functions that if you want to pass by reference you actually mean by reference, and not using standard PHP pointers
2015-12-03 11:17:48
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
Автор:
I like this method of concatinating methods by returning $this. It makes my code more readable. If the returned value is not an object it will fail and you find mistakes easier.

<?php
class Dummy {

    private 
$result;

    function 
__construct()
    {
       
$this->result =
           
$this
               
->setStuff('abc')
                ->
generateResult()
            ;
    }
   
    function 
setStuff($value)
    {
       
// do something
       
return $this;
    }

    function 
generateResult()
    {
        return [
'the result'];
    }

    function 
getResult()
    {
        return 
$this->result;
    }

}
?>
2016-11-22 16:20:08
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
Автор:
If a function/method parameter has a type declaration , then php compiler will check it the moment of invocation regardless if strict_types is set to 1 or 0 or not set at all.

However, php will check parameters types on build in php functions when  strict_types is set to 1;
2017-10-12 22:30:27
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

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