Php 8 multiple return types

As of PHP 8+, you may use union types:

function test(): FailObject|SuccessObject {}

Another way, available in all versions since PHP 4, is for the two objects to share an interface. Example:

interface ReturnInterface {}
class FailObject implements ReturnInterface {}
class SuccessObject implements ReturnInterface {}
function test(): ReturnInterface {}

In this example, ReturnInterface is empty. Its mere presence supports the needed return type declaration.

You could also use a base, possibly abstract, class.


To me, for this use case, interfaces are more clear and more extensible than union types. For example, if I later want a WarnObject I need only to define it as extending ReturnInterface -- rather than going through all signatures and updating them to FailObject|SuccessObject|WarnObject.

Values are returned by using the optional return statement. Any type may be returned, including arrays and objects. This causes the function to end its execution immediately and pass control back to the line from which it was called. See return for more information.

Note:

If the return is omitted the value null will be returned.

Use of return

Example #1 Use of return

function square($num)
{
    return 
$num $num;
}
echo 
square(4);   // outputs '16'.
?>

A function can not return multiple values, but similar results can be obtained by returning an array.

Example #2 Returning an array to get multiple values

function small_numbers()
{
    return [
012];
}
// Array destructuring will collect each member of the array individually
[$zero$one$two] = small_numbers();// Prior to 7.1.0, the only equivalent alternative is using list() construct
list($zero$one$two) = small_numbers();?>

To return a reference from a function, use the reference operator & in both the function declaration and when assigning the returned value to a variable:

Example #3 Returning a reference from a function

function &returns_reference()
{
    return 
$someref;
}
$newref =& returns_reference();
?>

For more information on references, please check out References Explained.

ryan dot jentzsch at gmail dot com

5 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:

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.

rstaveley at seseit dot com

12 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.

# (1) Objects are always passed by reference and returned by referenceclass 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 suchfunction 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 scalarsfunction &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 scalarsfunction 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 arraysfunction &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";

bgalloway at citycarshare dot org

14 years ago

Be careful about using "do this thing or die()" logic in your return lines.  It doesn't work as you'd expect:

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.

nick at itomic.com

19 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.

function &testRet()
{
    return
NULL;
}

if (

testRet() === NULL)
{
    echo
"NULL";
}
?>

parses fine and echoes NULL

k-gun !! mail

5 years ago

With 7.1, these are possible yet;

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!
   
}
}
?>

Berniev

4 years ago

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.

ryan dot jentzsch at gmail dot com

7 years ago

PHP 7 return types if specified can not return a null.
For example:
declare(strict_types=1);

function

add2ints(int $x, int $y):int
{
   
$z = $x + $y;
    if (
$z===0)
    {
        return
null;
    }
    return
$z;
}
$a = add2ints(3, 4);
echo
is_null($a) ? 'Null' : $a;
$b = add2ints(-2, 2);
echo
is_null($b) ? 'Null' : $b;
exit();
Output:
7
Process finished with
exit code 139

zored dot box at gmail dot com

4 years ago

You may specify child return type if there is no parent:

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

class

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

class

C extends A {
    public function
f (int $a) // + argument type, WARNING
   
{
        return
1;
    }
}
?>

php(@)genjo(DOT)fr

2 years ago

Declaring a collection of objects as return type is not implemented and forbidden:
class Child{}

function

getChilds(): Child[]
{
    return [(new
Child()), (new Child())];
}
var_dump(getChilds());
// Returns:  Parse error: syntax error, unexpected '[', expecting '{'
?>

We have to use:
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:
function setChilds(Child[] $childs){}
// Not allowedfunction setChilds(array $childs){}
// Allowed
?>

Vidmantas Maskoliunas

6 years ago

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.

Can you return multiple values in PHP?

Use of return A function can not return multiple values, but similar results can be obtained by returning an array.

Can methods have multiple return types?

As per the Java Language Specification, the methods in Java can return only one value at a time. So returning multiple values from a method is theoretically not possible in Java.

What is mixed type in PHP?

mixed is a pseudo type added in PHP 8 that conveys the type of the parameter/return/property can be of any type. mixed type includes all scalar types in PHP, null , all class objects, callable , and even resource .

What is return type in PHP?

Definition and Usage. The return keyword ends a function and, optionally, uses the result of an expression as the return value of the function. If return is used outside of a function, it stops PHP code in the file from running.