PHP: 调用通过引用传递尚未定义的变量的函数是否有效?

PHP: Is valid to call a function passing by reference a variable not yet defined?

正如标题所问:通过引用传递尚未定义的变量可以调用函数吗?

让我们假设在任何情况下都会在函数内部设置变量。

我 post 示例代码为问题提供上下文:

function doStuff( &$error )
{
    $error = false;

    // Start doing stuff...
    // ...

    if( /* SOMETHING WRONG */ )
    {
        $error = "Something went wrong";
    }

}


doStuff( $err ); // $err is not defined!


if( $err !== false )
{
    // Handle the error, ex.

    echo $err;
    exit;
}

我用 error_reporting ( E_ALL ); 在 cli 上试过,没有报告错误。

我还是要确认它是否安全,没有缺点,编码模式还不错...

我会认为这很好,并且经常自己做 - 在您展示的设计中。这取决于 'purist' 你想成为什么样的人;可能有人说你不应该那样做。无论哪种方式,重要的是在函数开头清除或预设变量。

唯一的缺点是可能会有一个更大的代码库由多个人或多个组维护,并且处理调用方的人可能不会与处理函数的人联系。如果其中一个人不知道设计,这可能会导致问题,因为他可以假设变量 is 已经初始化 - 这就是为什么更纯粹的方法会说不这样做的原因.

作为引用参数传递的变量不是必须预先初始化;你在做什么很好。这种用例的一个典型例子是 preg_match:

int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )

除了正常的 return 值(int)之外,&$matches 参数用作辅助可选输出通道。由于这是传递引用值的主要用途之一,因此语言设计者已注意以尽可能最简单的方式使用它:

if (preg_match($foo, $bar, $match)) {
    echo $match[0];
}

将变量作为引用参数的参数传递会在调用者的范围内初始化变量。如果你不得不每次都这样使用它,这会导致非常烦人的代码:

$match = null;
if (preg_match($foo, $bar, $match)) {
    echo $match[0];
}