43

假设我在 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
4

8 回答 8

65

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

?>
于 2013-05-19T16:21:23.867 回答
10

您可以通过给它们一个默认值来使参数可选:

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

但是请注意,通过引用传递通常是不好的做法。如果突然我的值发生了$foo变化,我必须找出原因只是为了发现它是通过引用传递的。所以请只在你有一个有效的用例时使用它(相信我最没有)。

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

此外,目前您的函数正在返回不同类型的值。当引用被传递时,它返回null,否则返回false

于 2013-05-19T16:19:58.383 回答
10

针对@Martin Perry 的帖子,您可以区分

foo(); // "NULL"

foo($uninitialized_var); // "NULL"

使用func_num_args()

于 2015-04-27T12:16:37.207 回答
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
于 2013-05-19T16:21:42.203 回答
1

尝试

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

如果您将值传递给 &$reference,它将采用该值。否则为空。

于 2013-05-19T16:20:08.933 回答
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;

于 2013-05-19T16:22:00.693 回答
1

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

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

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

Larry Ullman 的这篇文章解释了通过引用传递变量与通过值传递的基础知识。

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

总而言之,当通过提供默认值使引用参数成为可选时,PHP 会“创建”一个新变量来保存默认值,以防我们没有为可选参数提供值。但是,如果我们确实提供了一个,我们必须提供一个变量,其引用参数只是一个别名。

于 2013-12-30T13:45:14.660 回答
0

通过引用传递对于赋值非常有用,有时您不需要检查值是否为null. 这将允许不加选择地将值分配给变量,包括未初始化的变量。

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

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

在这样的代码中很有用:

if (doSomething($value, $errorMessage) === false) {
    logError($errorMessage);
}

doSomething($value); // Explicitly ignore error message
于 2020-03-07T01:01:34.027 回答