PHP代码触发非数值值警告,执行异常原因及解决方法咨询
问题分析:PHP运算符优先级导致的非数值警告
你的问题核心是PHP中字符串连接符.的优先级高于算术运算符+,导致代码执行顺序和你预期的完全不一样,进而触发非数值转换警告。
代码执行过程拆解
先看你原代码的实际执行逻辑:
$y = null; $x = 2; echo $x . "<br>"; // 这里没问题:输出"2<br>",$x仍为整数2 echo $x = $x + 3 . '<br>'; // 重点:`.`优先级更高,先执行3 . '<br>'得到字符串"3<br>",再执行$x + "3<br>" echo $x = $x + 3 . "<br>"; // 第二次执行时,同样先处理3 . "<br>"成字符串,再和$x相加
PHP7.0+版本中,当你尝试把带有非数字后缀的字符串(比如"3
")转换为数值时,会触发Warning: A non-numeric value encountered警告——因为"3
"不是纯数值字符串,转换时只能提取前面的数字3,但这个过程会被PHP的严格模式检测到并抛出警告。
至于你说移除<br>标签后仍有问题,如果是写成echo $x = $x +3 . '';,本质逻辑还是一样:.优先级更高,先执行3 . ''得到字符串"3",再和$x相加。虽然这次不会触发警告,但执行顺序依然是先连接再相加,和你预期的“先加3再赋值”结果巧合一致,但逻辑不是你想要的。
和C++的差异
你提到类似逻辑在C中正常,是因为C里没有专门的字符串连接符.:如果是输出x + 3 << "<br>",C++会先执行算术加法x+3,再输出结果和字符串,这和你预期的逻辑完全一致。但PHP里的.是独立运算符,且优先级更高,所以必须手动加括号改变执行顺序。
修正方案
给加法运算加上括号,确保先执行算术操作,再做字符串连接:
$y = null; $x = 2; echo $x . "<br>"; echo $x = ($x + 3) . '<br>'; // 先算$x+3得到整数,再连接字符串 echo $x = ($x + 3) . "<br>";
这样执行顺序就完全符合预期:先计算$x+3得到整数,再和<br>连接成字符串,赋值给$x后输出,既不会触发非数值警告,逻辑也和你在C++中的写法一致。
内容的提问来源于stack exchange,提问作者Rahimbek
相关产品推荐
相关产品推荐

