ScotlandPHP 2016

Dönen değerler

Değerler, kullanımı seçime bağlı olan return deyimi kullanılarak döndürülür. Her türde değer döndürülebilir, buna diziler ve nesneler dahildir. return kullanıldığında işlevin çalışması o noktada hemen durdurulur ve denetim işlevin çağrıldığı satıra aktarılır. Daha ayrıntılı bilgi için return bölümüne bakınız.

Bilginize:

return belirtilmezse NULL değeri döner.

return kullanımı

Örnek 1 - return kullanımı

<?php
function square($num)
{
    return 
$num $num;
}
echo 
square(4);   // '16' çıktılar.
?>

Bir işlevden birden fazla değer döndüremezsiniz, ancak böyle bir sonucu bir dizi döndürülerek elde edebilirsiniz.

Örnek 2 - Bir diziyle birden fazla değerin döndürülmesi

<?php
function küçük_sayılar()
{
    return array (
012);
}
list (
$sıfır$bir$iki) = küçük_sayılar();
?>

Bir işlevden gönderimli bir değer döndürmek için, & işlecini hem işlev bildiriminde hem de dönen değeri bir değişkene atarken kullanmalısınız:

Örnek 3 - Bir işlevden gönderimli değer döndürmek

<?php
function &gönderimli_döndür()
{
    return 
$gönderim;
}

$yenigönderim =& gönderimli_döndür();
?>

Gönderimler hakkında daha fazla bilgi edinmek için Gönderimler Hakkında bölümüne bakınız.

Dönen tür bildirimleri

PHP 7'de dönen tür bildirimleri desteği eklenmiştir. Değiştirge türünde bildirimlere benzer şekilde, dönen tür bildirimlerinde değerin türünü bir işlevden dönen değerin türü belirler. Dönen tür belirtimlerinde kullanılabilen türler değiştirge türü bildirimlerdeki türlerle aynıdır.

Kesin tür belirtimi dönen tür belirtimlerini de etkiler. Öntanımlı zayıf kipte, dönen türler istenen türde değilse doğru türe zorlanır. Kesin tipte ise dönen değer doğru türde değilse TypeError istisnası oluşur.

Bilginize:

Bir ebeveyn yöntem geçersizleştirilirken çocuğun yönteminin ebeveyn üstündeki dönen tür bildirimiyle eşleşmesi gerekir. Eğer ebeveyn bir dönen tür tanımlamıyorsa çocuğun yöntemi de öyle yapabilir.

Örnekler

Örnek 4 Temel dönen tür bildirimi

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

// float döneceğini unutmayın.
var_dump(sum(12));
?>

Yukarıdaki örneğin çıktısı:

float(3)

Örnek 5 Kesin kip işe karışırsa

<?php
declare(strict_types=1);

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

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

Yukarıdaki örneğin çıktısı:

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

Örnek 6 Bir nesne döndürmek

<?php
class {}

function 
getC(): {
    return new 
C;
}

var_dump(getC());
?>

Yukarıdaki örneğin çıktısı:

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

User Contributed Notes 9 notes

up
22
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
10
ryan dot jentzsch at gmail dot com
11 months 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
12
nick at itomic.com
13 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
15
bgalloway at citycarshare dot org
8 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
2
ian at NO_SPAM dot verteron dot net
13 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
Nathan Salter
8 months ago
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->y = '150'; //works on $x
   
$x = new Obj(); // Does not modify $x outside of function
   
$x->y = '250';
}

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

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

objPointer($x);

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

$x->y = '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
up
-1
Vidmantas Maskoliunas
4 months 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.
up
-21
Anonymous
6 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
-52
ahmad at myandmyhost dot comze dot com
2 years 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