2013-05-19 34 views
31

說我已經在PHP中定義了一個函數,最後一個參數是通過引用傳遞的。有什麼辦法可以讓這個可選項?我怎麼知道它是否被設置?PHP - 使參考參數可選?

我從來沒有與通按引用在PHP,所以有可能是以下一個愚蠢的錯誤工作,但這裏有一個例子:

$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 

回答

49

PHP official manual摘自:

NULL可以作爲默認值,但不能從外部

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

設置的HTTP狀態代碼看看@MichalLohniský[評論](http://stackoverflow.com/a/29895514/1008530)。他對NULL有很好的見解。 – samuelg0rd0n

8

您可以通過給他們一個缺省值使得參數可選:

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

但是,請注意,通過引用是一般的不好的做法。如果突然我的$foo的價值改變了,我必須找出爲什麼只是發現它是通過引用傳遞的。所以,只有當你有一個有效的用例時,請使用它(並且最相信我不是)。

另外請注意,如果$reference應該是一個對象,您可能don't have to(不應該)通過引用來傳遞它。

此外,您的函數正在返回不同類型的值。當參考通過時,它返回null,否則返回false

+0

,如果不是因爲「我會給予好評[...]對象默認情況下通過引用通過「,這可以進一步澄清。 http://blog.golemon.com/2007/01/youre-being-lied-to.html – PleaseStand

+1

@PleaseStand我正在談論它是如何在用戶的土地上表現的。我可以開始談論裁判計數等,但我認爲這隻會混淆OP – PeeHaa

+0

我編輯了你的文章,添加了一個鏈接到PHP文檔,沒有提到「裁判計數」。如果您覺得不夠清楚,請隨時恢復變更。 – PleaseStand

1

嘗試

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

如果傳遞價值& $引用它會採取價值。否則爲空。

3

過去了,你可以設置默認值

$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

兩個選項:

聲明默認值,這是常規值範圍之外,例如-1

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

不要聲明帕拉姆,並檢查func_get_args(),看它是否通過了:

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

但是要注意,第二種方法將觸發不推薦的警告:Call-time pass-by-reference has been deprecated;

1

以下代碼片段說明引用只是變量名的別名:

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

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

Larry Ullman的article解釋了通過引用傳遞變量與傳遞值的基礎知識。

有趣的是,在Larry的文章末尾是另一個article的鏈接,深入解釋了PHP中引用和變量的基礎。

總而言之,當通過給定默認值使參考參數可選時,如果我們沒有爲可選參數提供一個值,PHP會'創建'一個新的變量來保存默認值。但是,如果我們提供了一個,我們必須提供一個變量,而引用參數只是一個別名。