PHP - 使引用参数可选吗?

时间:2013-05-19 16:13:51

标签: php

假设我在PHP中定义了一个函数,最后一个参数是通过引用传递的。有什么办法可以让我选择吗?我怎么知道它是否已经确定?

我从未在PHP中使用pass-by-reference,因此下面可能存在一个愚蠢的错误,但这是一个例子:

$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

8 个答案:

答案 0 :(得分:56)

取自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

?>

答案 1 :(得分:9)

您可以通过为参数提供默认值来使参数可选:

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

但是请注意,一般来说,通过引用传递是不好的做法。如果突然我的$foo的值发生了变化,我必须找出为什么只是发现它是通过引用传递的。因此,只有在您拥有有效的用例时才能使用它(并且最信任我的不是)。

另请注意,如果$reference应该是一个对象,您可能don't have to(并且不应该)通过引用传递它。

目前您的函数还返回不同类型的值。传递引用时,它将返回null,否则返回false

答案 2 :(得分:6)

@Martin Perry's post的反应,你可以区分

foo(); // "NULL"

foo($uninitialized_var); // "NULL"

使用func_num_args()

答案 3 :(得分: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

答案 4 :(得分:1)

尝试

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

如果您将值传递给&amp; $引用,它​​将采用该值。或者null。

答案 5 :(得分: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;

答案 6 :(得分:1)

以下代码段说明引用只是变量名称的别名:

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

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

Larry Ullman的这个article解释了通过引用传递变量和传递值的基础知识。

有趣的是,Larry的文章末尾是另一个article的链接,它深入解释了PHP中引用和变量的基础。

总而言之,当通过给出默认值使参考参数成为可选时,PHP'创建'一个新变量,它保存默认值,以防我们不为可选参数提供值。但是,如果我们提供一个,我们必须提供一个变量,参考参数只是一个别名。

答案 7 :(得分:0)

通过引用传递对分配至关重要,有时您不需要检查值是否为$('input[name="products"]').amsifySuggestags({ suggestionsAction : { timeout: -1, minChars: 2, minChange: -1, type: 'GET', url: '/sugg', beforeSend : function() { console.info('beforeSend'); }, success: function(data) { console.info('success'); }, error: function() { console.info('error'); }, complete: function(data) { console.info('complete'); } } }); 。这将允许将值(包括未初始化的值)随意分配给变量。

null

在以下代码中很有用:

function f(&$ref = null) {
    $ref = 1234;
}

f($x);
echo $x; // 1234
f(); // No error