为什么Laravel中获取的请求参数值总是被识别为string类型?
问题根因
所有HTTP URL查询参数的原始取值默认都是字符串类型,Web框架的Request对象不会自动做类型转换,所以无论你传入的是99、99.9还是NinetyNine,$request->amount拿到的永远是字符串,gettype()必然返回string,因此每次都会走string分支。
修复方案
你需要先判断字符串内容对应的实际类型,再走对应逻辑,不要直接判断原始值的类型,修改后代码参考如下:
public function run(){ $request = new Request(); $value = $request->amount; $type = ''; // 先判断是否为数值类字符串 if (is_numeric($value)) { $numVal = (float)$value; // 判断数值是否为整数 if ($numVal == (int)$numVal) { $type = 'integer'; } else { $type = 'double'; } } else { $type = 'string'; } switch($type){ case 'double': // 执行double类型对应逻辑 break; case 'string': // 执行string类型对应逻辑 break; case 'integer': // 执行integer类型对应逻辑 break; } }
注意事项
- 如果使用PHP8.0及以上版本,也可以配合
str_contains($value, '.')辅助判断浮点类型,需注意99.0这类实际为整数的边缘场景 - 不要直接用
intval()、floatval()强制转换后再判断类型,否则会把非数值字符串转为0,导致判断错误
内容的提问来源于stack exchange,提问作者user17426459
相关产品推荐
相关产品推荐

