PHP - 使引用参数可选吗?

Jak*_*ake 33 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
Run Code Online (Sandbox Code Playgroud)

Mar*_*rry 58

摘自PHP官方手册:

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

?>
Run Code Online (Sandbox Code Playgroud)

  • 我知道这是一个老问题,但对于那些将来会看到这个答案的人来说,foo(5) 和 foo(NULL) 会抛出错误,因为只有 VARIABLES 可以通过引用传递(5 和 NULL 不是变量) (2认同)

Pee*_*Haa 10

您可以通过为其赋予默认值来使参数可选:

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

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

另请注意,如果$reference应该是一个对象,您可能不必(也不应该)通过引用传递它.

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


Mic*_*ský 9

在回应@Martin Perry的帖子时,你可以区分

foo(); // "NULL"
Run Code Online (Sandbox Code Playgroud)

foo($uninitialized_var); // "NULL"
Run Code Online (Sandbox Code Playgroud)

使用func_num_args()