2013-05-19 36 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会'创建'一个新的变量来保存默认值。但是,如果我们提供了一个,我们必须提供一个变量,而引用参数只是一个别名。