2013-05-19 14 views
31

Powiedz, że zdefiniowałem funkcję w PHP, a ostatni parametr jest przekazywany przez odniesienie. Czy jest jakiś sposób, abym uczynił to opcjonalnie? Jak mogę sprawdzić, czy jest ustawiony?PHP - Czy parametr referencyjny jest opcjonalny?

nigdy nie pracował z pass-by-reference w PHP, więc nie może być głupkowaty błąd poniżej, ale oto przykład:

$foo; 
function bar($var1,&$reference) 
{ 
    if(isset($reference)) do_stuff(); 
    else return FALSE; 
} 

bar("variable");//reference is not set 
bar("variable",$foo);//reference is set 

Odpowiedz

49

Zrobione z PHP official manual:

NULL mogą być używane jako wartość domyślną, ale nie mogą być przekazywane z zewnątrz

<?php 

function foo(&$a = NULL) { 
    if ($a === NULL) { 
     echo "NULL\n"; 
    } else { 
     echo "$a\n"; 
    } 
} 

foo(); // "NULL" 

foo($uninitialized_var); // "NULL" 

$var = "hello world"; 
foo($var); // "hello world" 

foo(5); // Produces an error 

foo(NULL); // Produces an error 

?> 
+0

Spójrz na @Michal Lohniský [komentarz] (http://stackoverflow.com/a/29895514/1008530). Ma dobry wgląd w NULL-y. – samuelg0rd0n

8

Można dokonać argumentu opcjonalnego, dając im wartość domyślną :

function bar($var1, &$reference = null) 
{ 
    if($reference !== null) do_stuff(); 
    else return FALSE; 
} 

Należy jednak pamiętać, że przekazanie przez odniesienie jest ogólnie złą praktyką. Jeśli nagle zmieniła się moja wartość $foo, muszę się dowiedzieć, dlaczego tak się dzieje, tylko dlatego, że jest przekazywana przez odniesienie. Więc używaj tego tylko wtedy, gdy masz ważny przypadek użycia (i zaufaj mi, że większość nie jest).

Należy również pamiętać, że jeśli $reference ma być obiektem, prawdopodobnie don't have to (i nie powinno) przekazywać go przez odniesienie.

Również obecnie funkcja zwraca różne typy wartości. Gdy referencja zostanie przekazana, zwróci ona null i w inny sposób false.

+0

bym upvote jeśli nie to „[...] obiekty są domyślnie przekazane przez odniesienie ", co może posłużyć do dalszego wyjaśnienia. http://blog.golemon.com/2007/01/youre-being-lied-to.html – PleaseStand

+1

@PleaseStand Mówię o tym, jak zachowuje się na ziemi użytkownika. Mógłbym zacząć mówić o licznikach referencyjnych itp., Ale myślę, że to tylko pomyliłoby OP – PeeHaa

+0

Zmontowałem twój post, aby dodać link do dokumentacji PHP na tym, który nie wspomina "ref counts". Możesz cofnąć zmianę, jeśli uważasz, że nie jest to wystarczająco jasne. – PleaseStand

1

spróbować

use function bar($var1,&$reference=null) 
{ 
    if(isset($reference)) do_stuff(); 
    else return FALSE; 
} 

jeśli przejdą wartość & $ odwoływać zajmie tę wartość. lub null.

3

można ustawić wartości domyślne

$foo; 
function bar($var1,&$reference = false) 
{ 
    if($reference != false) do_stuff(); 
    else return FALSE; 
} 

bar("variable");//reference is not set 
bar("variable",$foo);//reference is set 
1

Two opcje:

Stwierdzenie wartości domyślnej, która jest poza zakresem wartości regularnie, na przykład -1

function bar($var1,&$reference = -1) 
{ 
    if($reference !== -1) do_stuff(); 
    else return FALSE; 
} 

Nie zadeklarować param i sprawdzić func_get_args() aby sprawdzić, czy została podjęta:

function bar($var1) 
{ 
    if(count(func_get_args()) > 1) do_stuff(); 
    else return FALSE; 
} 

jednak pamiętać, drugie podejście wywoła przestarzałej ostrzeżenie: Call-time pass-by-reference has been deprecated;

1

Poniższy fragment kodu pokazuje, że punktem odniesienia jest po prostu alias dla nazwy zmiennej:

<?php 
function set_variable(&$var, $val) 
{ 
    $var = $val; 
} 

set_variable($b, 2); 
echo $b; // 2 
?> 

Ten article Larry'ego Ullmana wyjaśnia podstawy przekazywania zmiennej przez odniesienie do przejścia przez wartość.

Co ciekawe, na końcu artykułu Larry'ego znajduje się link do innego article, który szczegółowo wyjaśnia podstawy odniesień i zmiennych w PHP.

Podsumowując, jeśli parametr referencyjny jest opcjonalny, podając wartość domyślną, PHP "tworzy" nową zmienną, która przechowuje wartość domyślną w przypadku, gdy nie podamy wartości dla parametru opcjonalnego. Ale na wypadek gdybyśmy je dostarczyli, musimy podać zmienną, dla której parametr referencyjny jest tylko aliasem.

Powiązane problemy