
当 PHP 尝试对两个字符串类型变量执行乘法运算(如 $a * $b)时,会抛出 Fatal error: Unsupported operand types: string * string,根本原因是 PHP 无法隐式转换非数值字符串为数字,需显式类型转换。
当 php 尝试对两个字符串类型变量执行乘法运算(如 `$a * $b`)时,会抛出 `fatal error: unsupported operand types: string * string`,根本原因是 php 无法隐式转换非数值字符串为数字,需显式类型转换。
该错误常见于从表单、会话(如 $_SESSION["ShoeCart"])或数据库读取的数据未经过类型校验的场景。在您的代码中,$value["shoe_quantity"] 和 $value["shoe_price"] 表面看是数字,但实际存储为字符串(例如 "5" 和 "129.99"),而 PHP 7.4+ 对算术运算的类型检查更严格——*字符串之间不支持 `` 运算符**,直接相乘将触发致命错误。
✅ 正确做法是:在参与算术运算前,显式转换为数值类型。推荐使用 floatval()(兼顾整数与浮点数)或 (float) 强制转换,而非 intval()(会截断小数,导致价格计算失准):
<td><?php echo number_format(floatval($value["shoe_quantity"]) * floatval($value["shoe_price"]), 2); ?></td>
同时,建议在累加总价时也统一转换:
$total += floatval($value["shoe_quantity"]) * floatval($value["shoe_price"]);
⚠️ 注意事项:
立即学习“PHP免费学习笔记(深入)”;
- 避免依赖 + 操作符的隐式转换(如 "5" + "129.99" 虽能工作,但不可靠且易掩盖数据质量问题);
- 更健壮的做法是在将数据存入 $_SESSION["ShoeCart"] 时就完成类型标准化(例如入库前用 floatval() 处理);
- 可添加防御性检查,防止空值或非法字符导致 floatval("") === 0.0 引发静默错误:
$qty = is_numeric($value["shoe_quantity"]) ? floatval($value["shoe_quantity"]) : 0; $price = is_numeric($value["shoe_price"]) ? floatval($value["shoe_price"]) : 0; $subtotal = $qty * $price;
总结:PHP 的强类型演进要求开发者主动管理数据类型。面对购物车等业务逻辑,务必在运算前校验并转换数值字段,既可消除 TypeError,又能提升代码健壮性与可维护性。



















