【问题标题】:PHP: $i = $i++ crashed the serverPHP: $i = $i++ 使服务器崩溃
【发布时间】:2011-01-01 05:13:33
【问题描述】:

这在我知道 SO 之前几年就发生在我身上,但我仍然很好奇。在我还在学习PHP基础的时候,不小心输入了$i = $i++;,在浏览器中测试网页时,服务器崩溃了,需要很长时间才能恢复。我之前输入了一些非常愚蠢的东西并创建了一堆无限循环,但出于某种原因,这是最糟糕的。有谁知道为什么这条线这么“有毒”

【问题讨论】:

  • 您是否重试并(取消)评论此行?可能是别的原因,因为你还年轻天真,错误地认为那条线是问题所在。
  • 我的两台电脑(LAMP 和 WAMP)都不会崩溃。测试代码只是$i=0;$i=$i++;echo "You are alive",它只是说“你还活着”没有任何问题。
  • 那里没有任何东西会使服务器崩溃。刚试过!
  • 不,我绝对记得将增量从 $i = $i + 2; 更改为 $i++; 并创建了邪恶的混合体。

标签: php


【解决方案1】:

$i = $i++; 本质上与$i = $i; 相同。

不幸的是,$i = $i++; 被称为"undefined behavior"

任何事情都可能发生,因为编译器无法完全理解正在发生的事情。

有一个很好的 SO question 涵盖了类似的未定义行为 here

【讨论】:

  • 听起来不错,我们使用了一个非常挑剔的服务器,这可以解释为什么其他人可以在不崩溃的情况下完成它。
  • 我的猜测是,几年前,如果运行该代码,服务器正在运行的 PHP 版本会崩溃。不确定。
  • 是的。重新分配给i(明确地)是绝对多余的。可以看到初学者如何偶然发现这一点。可惜太无情了。
  • 漂亮的委婉说法:“未定义的行为”表示服务器崩溃。
  • 为此使用标签“未定义的行为”是一个飞跃。所有 PHP 表达式都有返回值; $i++ 的返回值只是分配给 $i,这可能是多余的。编译器没有什么是不“理解”的,我和那些认为 op 是/被混淆的人在一起。
【解决方案2】:

这不会导致任何崩溃。

$i = $i++;
var_dump($i); // NULL;

来自PHP Manual

不需要初始化 PHP中的变量但是它是一个非常 好的做法。未初始化的变量 具有其类型的默认值 取决于他们所处的环境 被使用了。

另外,by default, variables are always assigned by value 并且由于您使用的是Post Increment,因此未初始化的 $i (NULL) 的值首先通过复制分配给 $i,从而有效地覆盖自身。查看此代码以了解会发生什么:

$i = 0
$i = $i++;
var_dump($i); // int(0);

我不知道 PHP 在赋值后是否还会尝试增加右手变量的值。如果您对此感兴趣,请安装 PECL 扩展 Parsekit 并查看 OP 代码以获取更多详细信息。

所以很可能是其他原因导致您的服务器崩溃。

【讨论】:

    【解决方案3】:
    $ php -r '$i=0; $i = $i++; echo "=> ".$i."\n";'
    => 0
    

    【讨论】:

      猜你喜欢
      • 2020-08-24
      • 2016-08-09
      • 1970-01-01
      • 2015-04-16
      • 1970-01-01
      • 2016-02-11
      • 1970-01-01
      • 2016-06-12
      • 2017-07-29
      相关资源
      最近更新 更多