【问题标题】:PHP: Is valid to call a function passing by reference a variable not yet defined?PHP:调用通过引用传递尚未定义的变量的函数是否有效?
【发布时间】:2017-01-11 12:49:20
【问题描述】:

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

假设在任何情况下变量都将设置在函数内部

我发布示例代码以提供问题的上下文:

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上试过了,没有报错。

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

【问题讨论】:

  • 通过引用传递参数一种不好的编码模式/习惯。没有提示读取doStuff($err) 行的人该函数将修改作为参数传递的变量。此外,没有暗示该函数不接受文字或常量作为参数。
  • @axiac 如果您在没有阅读文档的情况下调用随机函数,那么没有什么可以帮助您。在某些情况下,引用参数是一种完全有效的技术。
  • 当你想返回一个布尔值并更新一些数组数据时非常有用。但是,这也可以通过使用存储任何错误的对象 (oop) 来实现,并且您可以添加方法以获得额外的功能。例如。 $errorObj = 新的错误消息(); doStuff($errorObj);
  • @JaredFarrish 谢谢你,非常有趣和可怕。我对 PHP 了解得越多,我就越不喜欢它。

标签: php pass-by-reference


【解决方案1】:

作为引用参数传递的变量必须事先初始化;你在做什么很好。这种用例的一个经典例子是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];
}

【讨论】:

  • “烦人的代码”情况正是我要避免的,就像我发布的代码示例一样。谢谢你的详细解答
【解决方案2】:

我认为这很好,并且经常自己做 - 与您展示的设计一样。这取决于您想成为多么“纯粹”;可能有人说你不应该这样做。无论哪种方式,在函数开头清除或预设变量都很重要。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    • 2011-10-03
    • 2012-04-20
    • 1970-01-01
    • 2015-10-25
    相关资源
    最近更新 更多