【问题标题】:Is it a bug in PHP with assignment by reference? [duplicate]它是通过引用分配的 PHP 中的错误吗? [复制]
【发布时间】:2014-04-08 13:56:43
【问题描述】:

这是可能揭示 PHP 错误的简化代码版本

class AClass
{
    public static $prop = "Hi";
}
function assignRef (&$ref)
{
    $ref = &AClass::$prop;
    echo "inside assignRef: $ref\n";
}
$ref = "Hello";
assignRef($ref);
echo "outside: $ref\n";

打印出来

inside assignRef: Hi
outside: Hello

不应该通过引用AClass 类的$prop 静态变量来分配$ref,并且不仅在assignRef 函数内部而且在它外部都变为“Hi”?

【问题讨论】:

  • $ref = "Hello" 如果我没记错的话,会用字符串“Hello”覆盖变量
  • 参数声明中的&不是你想要的吗?为什么还有 & in "$ref = &AClass::$prop;"
  • @DavidWilkins $ref$ref = "Hello" 发生时未分配
  • 您的问题是 $ref = &AClass::$prop; 中的虚假 & 将其更改为 $ref = AClass::$prop; 它将按您的预期工作
  • @DesmondHume 为什么我的回答难以接受?就是这样。有些限制只是设计使然。甚至有 C 语言不允许的东西(比如stackoverflow.com/questions/19681025)。

标签: php reference


【解决方案1】:

您示例中的类是不相关的简化版本,会产生相同的输出:

function assignRef (&$ref)
{
    $prop = 'Hi';
    $ref = &$prop;
    echo "inside assignRef: $ref\n";
}
$ref = "Hello";
assignRef($ref);
echo "outside: $ref\n";

发生的情况是,在函数内通过引用分配时 ($ref = &$prop;),您只是更改了一个变量指向的内容,而不是更改它最初指向的值,也没有更改对该原始变量的任何其他引用价值。

在此示例中,您实际上有两个名为 $ref 的变量 - 一个在函数内部,一个在函数外部。您正在更改函数内的变量指向的内容,而使另一个变量指向原始(未更改)值。

考虑以下代码:

$a = 'a';
$b = 'b';
$c = 'c';

$a = &$b;
$b = &$c;
echo "$a / $b / $c";

这将导致b / c / c 的输出,而不是您可能期望的c / c / c。发生这种情况的原因相同——引用赋值不会影响最初引用的值,也不会更改任何其他引用,这意味着指向原始值的任何其他变量都不会改变。

如果要更改值,而不是创建对另一个值的新引用,则必须使用普通赋值 (=)。或者,您可以更改所有引用。

【讨论】:

  • 我认为这2段代码没有关系,第二段代码的结果完全正常,符合预期
  • 有什么不同?通过引用传递给函数时,您有两个变量指向相同的值,更改其中一个指向的变量不会影响原始值。这与我在 abc 示例中所做的完全相同。
猜你喜欢
  • 2023-03-17
  • 1970-01-01
  • 2017-10-24
  • 1970-01-01
  • 2015-07-11
  • 2014-08-07
  • 1970-01-01
  • 2016-07-12
相关资源
最近更新 更多