International PHP Conference 2015

Valori restituiti

I valori vengono restituiti usando l'istruzione opzionale return. Può essere restituito qualsiasi tipo, incluse liste ed oggetti. Ciò provoca l'interruzione dell'esecuzione della funzione immediatamente e la restituzione del controllo alla linea da cui è stata chiamata. Vedere return per maggiori informazioni.

Nota:

Se return è omesso, verrà restituito il valore NULL.

Uso di return

Example #1 Esempio di uso di return

<?php
function quadrato ($num)
{
    return 
$num $num;
}
echo 
quadrato(4);   // L'output è '16'.
?>

Non possono essere restituiti valori multipli da una funzione, ma risultati simili possono essere ottenuti restituendo un array.

Example #2 Restituzione di un array per ottenere più valori

<?php
function numeri_piccoli()
{
    return array (
012);
}
list (
$zero$uno$due) = numeri_piccoli();
?>

Per restituire un riferimento da una funzione, è necessario usare l'operatore di passaggio per riferimento & in entrambe le dichiarazioni di funzioni e quando viene assegnato il valore restituito ad una variabile:

Example #3 Restituzione di un riferimento ad una funzione

<?php
function &restituisce_riferimento()
{
    return 
$un_riferimento;
}

$nuovo_riferimento =& restituisce_riferimento();
?>

Per maggiori informazioni sui riferimenti, consultare References Explained.

Dichiarazioni dei tipi di ritorno

PHP 7 aggiunge il supporto per le dichiarazioni dei tipi di ritorno. Analogamente alle dichiarazioni dei tipi degli argomenti, le dichiarazioni dei tipi di ritorno specificano il tipo del valore che sarà restituito dalla funzione. Sono disponibili gli stessi tipi per le dichiarazioni dei tipi di ritorno come per le dichiarazioni dei tipi degli argomenti.

La tipizzazione ha anche un effetto sulle dichiarazioni dei tipi di ritorno. Nella modalità di default debole, i valori restituiti saranno convertiti nel tipo corretto se non sono già di quel tipo. Nella modalità forte, il tipo restituito deve essere del tipo corretto, altrimenti verrà generata un TypeError.

Nota:

Quando si sovrascrive un metodo genitore, il metodo del figlio deve avere la stessa dichiarazione del tipo di ritorno del genitore. Se il genitore non definisce un tipo, allora il metodo del figlio può farlo.

Esempi

Example #4 Dichiarazione del tipo di ritorno di base

<?php
function sum($a$b): float {
    return 
$a $b;
}

// Notare che verrà restituito un float.
var_dump(sum(12));
?>

Il precedente esempio visualizzerà:

float(3)

Example #5 Modalità rigorosa in azione

<?php
declare(strict_types=1);

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

var_dump(sum(12));
var_dump(sum(12.5));
?>

Il precedente esempio visualizzerà:

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

Example #6 Restituzione di un oggetto

<?php
class {}

function 
getC(): {
    return new 
C;
}

var_dump(getC());
?>

Il precedente esempio visualizzerà:

object(C)#1 (0) {
}
add a note add a note

User Contributed Notes 7 notes

up
20
rstaveley at seseit dot com
5 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
14
bgalloway at citycarshare dot org
7 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
12 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
up
4
ian at NO_SPAM dot verteron dot net
12 years ago
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
up
0
ryan dot jentzsch at gmail dot com
1 day ago
PHP 7 return types if specified can not return a null.
For example:
<?php
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
up
-9
Anonymous
5 years ago
As of at least PHP 5.3, a function or class method returning an object acts like an object.

<?php

class A {
    function
test() {
        echo
"Yay!";
        }
    }

function
get_obj() {
    return new
A();
    }

get_obj()->test();  // "Yay!"

?>

Sorry, still doesn't work with arrays.  Ie <?php echo get_array()[1]; ?> fails.
up
-28
ahmad at myandmyhost dot comze dot com
1 year ago
we can return array using foreach
<?php
function my_func2()
{
    return array(
"Name"=>"Ahmad Sayeed","Email"=>"ahmad@gmail.com");
   
}
$ar = my_func2();
foreach(
$ar as $key=>$value)
{echo
$key." , ".$value,"<br />";}

?>
To Top