php 不带括号的字符串连接中的算术运算导致奇怪的结果

m0rkklqb  于 2023-02-28  发布在  PHP
关注(0)|答案(4)|浏览(119)

请看下面的代码行:

<?php
$x = 10;
$y = 7;

echo '10 - 7 = '.$x-$y;
?>

其输出为3,这是计算$x-$y的预期结果。但是,预期输出为:
10 - 7 = 3
因此,我的问题是,我与计算连接的字符串发生了什么变化?我知道,为了产生我所期望的结果,我需要将算术运算括在括号中:

<?php
$x = 10;
$y = 7;

echo '10 - 7 = '.($x-$y);
?>

产出
10 - 7 = 3
但是由于PHP没有抱怨原始代码,我想知道在这种情况下产生的输出背后的逻辑是什么?字符串去了哪里?如果有人能解释它或告诉我PHP手册中解释它的位置,我将不胜感激。

vhmi4jdf

vhmi4jdf1#

.-具有相同的precedence,因此PHP将'10 - 7 = 10'重新解释为一个数字,得到10,减去7得到3

cgh8pdjw

cgh8pdjw2#

PHP按照这里定义的顺序运行操作;https://www.php.net/manual/en/language.operators.precedence.php
看看这个例子;

$session_period = 30;    
new \DateTime('now -' . $session_period+1 . ' minutes');

注意!这不会给你31分钟前的时间。在这种情况下,PHP只是从表达式的最左边开始解释,所以这个看起来很简单的表达式返回了错误的结果;
因为;

  • '现在-'. $会话周期=〉'现在-30'
  • 那么PHP会将字符串强制转换为0,并在=〉1的基础上加1
  • 以及1."分钟"=〉"1分钟"

这就是为什么上面的表达式会给出

new \DateTime('1 minutes')

为了避免这种混淆,可以像这样使用();

new \DateTime('now -' . ($session_period+1) . ' minutes');
nbysray5

nbysray53#

字符串'10 - 7 = '$x连接,然后被解释为int,结果为10,然后减去7,结果为3
有关详细说明,请尝试以下操作:

echo (int) ('10 - 7 = ' . 10); // Prints "10"

有关字符串到数字转换的详细信息,请访问http://www.php.net/manual/en/language.types.string.php#language.types.string.conversion
如果字符串以有效的数字数据开头,则将使用此值

iyr7buue

iyr7buue4#

在此代码中:

echo '10 - 7 = '.$x-$y;

连接优先,所以剩下的是:

echo '10 - 7 = 10'-$y;

因为这是尝试对字符串执行整数减法,所以字符串首先被转换成整数,所以你得到了如下的结果:

echo (int)'10 - 7 = 10'-$y;

该字符串的整数值为10,因此生成的算术结果如下所示:

echo 10-$y;

因为$y7,并且10 - 7 = 3,所以回显的结果是3

相关问题