<分区>
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,
visit the help center 指导。
关闭 10 年前 。
今天在工作中,我被一行代码困住了,我无法理解。
我在 JavaScript 中有一个函数,为了确保获得唯一的时间戳,我执行了那个丑陋的循环:
var ts = +new Date();
while (ts === (ts = +new Date()));
我认为很清楚我们正在重新设置 ts 直到它的值变得不同。
但是当我尝试将函数迁移到 PHP 代码时 - 就像那样:
$ts = preg_replace('/^\d\.(\d+)\s(\d+)$/', '$2$1', microtime());
//regex extracts digits and re-positions them - ugly microtime :(
while ($ts === ($ts = preg_replace('/^\d\.(\d+)\s(\d+)$/', '$2$1', microtime())));
解释器进入无限循环。我所有的尝试似乎都指出 $ts 赋值是在比较之前进行的,但我不明白为什么没有首先解决左侧表达式。我对 PHP 的了解不如我对 JavaScript 的了解,所以我想知道是否有一些关于 PHP 表达式和语句的关键提示我正在泄露。
建议:我不想通过制作“构造良好”的循环来修复我的代码 - 解决方案很明显 - 我很想了解这里发生的事情。非常感谢所有帮助。
PHP 需要先评估赋值,然后才能进行比较。通常,赋值运算符的优先级非常低,因此当您编写 $a = $b + $c
时,先计算加法,然后再将结果赋值给 $a。
然而,这是一个特例,虽然它似乎没有被很好地记录下来,但在文档中找到了类似的案例,说明:
Although =
has a lower precedence than most other operators, PHP will
still allow expressions similar to the following: if (!$a = foo())
, in
which case the return value of foo()
is put into $a
.
所以在这种情况下,PHP 确定它需要进行赋值,然后才能否定赋值的结果。我认为这里发生了类似的事情,尽管你是对的,PHP 应该能够稍后进行分配。
实际上,结果可能是不可预测的,就像其他一些表达式一样:
// mixing ++ and + produces undefined behavior
$a = 1;
echo ++$a + $a++; // may print 4 or 5