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];
}
正如标题所问:通过引用传递尚未定义的变量可以调用函数吗?
让我们假设在任何情况下都会在函数内部设置变量。
我 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];
}