Validation 框架 FloatVal 校验器全解析:宽松浮点数值校验与模板机制

📅 发布时间:2026/10/6 7:45:55
Validation 框架 FloatVal 校验器全解析:宽松浮点数值校验与模板机制
后端开发工具【免费下载链接】ValidationThe most awesome validation engine ever created for PHP项目地址https://gitcode.com/gh_mirrors/va/Validation点击查看免费下载Validation 是 PHP 生态中著名的校验引擎而FloatVal是其数值与类型分类下最常用的校验器之一它并不要求输入在 PHP 层面上真的是float类型而是只要能被解析成浮点数即算通过。本文将以 FloatVal 官方文档 为主体结合 FloatVal 源码 与 单元测试讲清它的判定规则、底层实现、与FloatType的本质区别以及如何在项目中自定义错误模板。读完本文你将能够准确判断字符串数字、科学计数法、整型等各类输入在FloatVal下的表现并把它与其他数值类校验器正确搭配使用。一、FloatVal 是什么值可解析为浮点数即通过FloatVal的定位是值校验Val 后缀而非类型校验Type 后缀。官方文档对其功能的定义只有一句话Validate whether the input value is float——即校验输入值是否为浮点数。它的核心语义是不关心输入的 PHP 原生类型只关心输入内容能否被当作一个合法的浮点数值来理解。因此真正的float变量如1.5、0.0、1e12必然通过内容是合法数字的字符串如165.7、1e5也能通过甚至连整型如165、1、0也会被判定为合法浮点值因为整型可以被无损地视作浮点数。二、基本用法从文档示例到更多场景官方文档给出了一组最短的用法示例先看原始示例v::floatVal()-assert(1.5); // Validation passes successfully v::floatVal()-assert(1e5); // Validation passes successfully第一个示例验证了标准的float字面量第二个示例验证了科学计数法字符串1e5——这正是FloatVal区别于严格类型校验器的关键它允许字符串形式的数值。结合源码实现与单元测试我们可以把行为边界扩充得更完整。根据 FloatValTest.php 的有效输入数据提供器以下输入全部判定为合法浮点值v::floatVal()-validate(165); // true整型也通过 v::floatVal()-validate(1); // true v::floatVal()-validate(0); // true v::floatVal()-validate(0.0); // true v::floatVal()-validate(1); // true纯数字字符串 v::floatVal()-validate(19347e12); // true科学计数法字符串 v::floatVal()-validate(165.0); // true v::floatVal()-validate(165.7); // true带小数点的字符串 v::floatVal()-validate(1e12); // true科学计数法浮点字面量而根据同一测试文件的无效输入数据提供器以下输入会被拒绝v::floatVal()-validate(); // false空字符串 v::floatVal()-validate(null); // false v::floatVal()-validate(a); // false非数字文本 v::floatVal()-validate( ); // false纯空白 v::floatVal()-validate(Foo); // false此外validate()、assert()是同一套判定逻辑的两种出口validate()返回布尔值适合条件判断assert()在失败时抛出异常并携带可读的错误消息。与文档中assert的用法保持一致日常代码里两种写法都常见。三、底层实现filter_var 与 FILTER_VALIDATE_FLOATFloatVal的判定逻辑极其简洁完整实现在 src/Validators/FloatVal.phppublic function isValid(mixed $input): bool { return is_float(filter_var($input, FILTER_VALIDATE_FLOAT)); }逐层拆解这条调用链filter_var($input, FILTER_VALIDATE_FLOAT)使用 PHP 内置过滤扩展尝试把输入解析为浮点数。它内部遵循 PHP 的浮点字面量语法天然支持十进制、负号、小数点以及科学计数法e/E指数因此1e5、19347e12这类字符串会被解析为100000.0之类的 float 值而、a、Foo、null、纯空白字符串则会解析失败。is_float(...)对外层结果再做一次类型确认。这一步之所以必要是因为FILTER_VALIDATE_FLOAT在解析成功时返回float失败时返回false——用is_float判断可以明确区分解析成功得到浮点数与解析失败返回布尔 false避免把失败的false误判为合法值。值得强调的是由于filter_var会先做值解析所以整型输入165会被转换成165.0floatis_float判定为真——这解释了第一节表格中165、1、0均能通过的原因。这是FloatVal作为值校验器的刻意设计而非缺陷。在类结构上FloatVal继承自 src/Validators/Core/Simple.php 这个抽象基类。Simple把校验拆成两个抽象层级子类只需实现isValid(mixed $input): bool返回布尔判定基类则自动将其包装为evaluate()产出统一的Result对象供链式校验、结果过滤与异常抛出机制复用。也就是说FloatVal只需要关心是或不是其余工程细节全部由框架承担。四、与 FloatType 的区别宽松值校验 vs 严格类型校验这是使用FloatVal时最容易踩的坑它和FloatType看似孪生语义却完全不同。两者在文档的 See Also 中互相引用建议对照阅读 FloatType 文档。对比两个类的核心实现即可一目了然FloatVal源码is_float(filter_var($input, FILTER_VALIDATE_FLOAT))——先解析再判断字符串数字也能通过FloatType源码is_float($input)——直接检查 PHP 原生类型只有真正的 float 变量才通过。输入floatVal()floatType()1.5✅ 通过✅ 通过0.0✅ 通过✅ 通过1.5✅ 通过❌ 拒绝消息1.5 must be a float1e5✅ 通过❌ 拒绝165int✅ 通过❌ 拒绝FloatType文档中的示例也印证了这一点v::floatType()-assert(1.5); // Validation passes successfully v::floatType()-assert(1.5); // → 1.5 must be a float选用建议如果数据来自表单、API 请求等文本输入场景期望用户填写数值且允许字符串形式用FloatVal如果数据来自强类型内部计算、必须确保变量本身是 float用FloatType。两者配合时一般建议输入侧宽松、输出侧严格。五、与 IntVal / IntType 的对照数值家族的行为差异FloatVal的 See Also 还指向整型家族这一对照有助于理解 Val/Type 后缀在整个数值校验体系中的一致性设计IntVal 源码is_int($input)为真或字符串匹配正则/^-?\d$/——即整型本身或可选负号的纯数字字符串通过IntType 源码is_int($input)——只接受原生整型。可见整个数值家族遵循完全一致的规律Type 后缀校验 PHP 原生类型Val 后缀校验值是否可被解析为该数值。另一个重要差异值得注意IntVal用的是preg_match正则因此1.5、1e5这类非整数字符串会被拒绝而FloatVal走的是filter_var浮点过滤器天然容忍小数与科学计数法。这也说明两个校验器的判定能力与 PHP 底层语法规则绑定选择时不要脱离输入数据的真实形态。六、模板机制TEMPLATE_STANDARD 与 subject 占位符FloatVal与其他校验器一样通过#[Template]属性声明错误消息模板源码中的定义如下见 src/Validators/FloatVal.php#[Template( {{subject}} must be a floating-point number, {{subject}} must not be a floating-point number, )]对应文档中的模板表ModeTemplatedefault{{subject}} must be a floating-point numberinverted{{subject}} must not be a floating-point number两点说明default与inverted默认模式在输入不合法时使用inverted模式用于取反场景。在Not前缀如v::not(v::floatVal())或反向断言时框架会自动切换到第二条模板保证语义仍然通顺。模板机制本身由 src/Message/Template.php 这个属性类承载它把default、inverted文本与id默认为Validator::TEMPLATE_STANDARD绑定在一起。{{subject}}占位符根据文档说明它代表被校验的输入值或若指定了自定义校验器名称。也就是说如果在链式构建中给校验器起了名字错误消息会优先展示这个名字使报错更贴近业务上下文。关于占位符替换的完整机制可进一步参考 docs/messages/placeholder-conversion.md。七、分类与变更历史分类CategorizationFloatVal同时归属Numbers与Types两个类别这与其按数值语义校验、又涉及类型判定的双重属性一致。可在 docs/validators.md 的分类索引中与其他同类校验器对比检索。变更历史Changelog3.0.0模板体系变更Templates changed——新版以#[Template]属性和TEMPLATE_STANDARD常量取代旧版消息机制这也是所有校验器在 v3 中的统一改动1.0.0校验器创建Created。若你正在从 v2 迁移模板消息的改动细节可参考 docs/migrating-from-v2-to-v3.md。八、测试验证与实战要点FloatVal的单元测试位于 tests/unit/Validators/FloatValTest.php它继承自框架的 RuleTestCase通过providerForValidInput/providerForInvalidInput两套数据驱动对上述所有通过/拒绝用例进行逐一断言。这套测试本身就是一份绝佳的行为规格说明书——当你对某个输入边界拿不准时直接查阅该文件即可得到权威答案。最后梳理几条实战要点接受字符串数字floatVal()会放过165.7、1e5适合校验表单与接口入参需要严格 float 类型时改用floatType()不要误用FloatVal整数也会通过165、1、0均判定为合法浮点值若业务上要求必须带小数点需另行用Regex等校验器补充约束错误消息可定制通过setTemplate()或链式命名机制替换{{subject}} must be a floating-point number的默认文案使其更贴合产品语境。相关阅读FloatType 文档严格类型校验BoolType 文档、BoolVal 文档IntType 文档、IntVal 文档validators 总览、占位符转换机制赞分享后端开发工具【免费下载链接】ValidationThe most awesome validation engine ever created for PHP项目地址https://gitcode.com/gh_mirrors/va/Validation点击查看免费下载相关推荐TypeSpec Emitter 开发完全指南从 $onEmit 到自定义代码生成TypeSpec Emitter 开发完全指南从 $onEmit 到自定义代码生成 本指南围绕 TypeSpec https://link.gitcode.c后端开发工具Mongoose 数据校验Validation完全指南内置校验器、自定义校验与更新校验器Mongoose 数据校验Validation完全指南内置校验器、自定义校验与更新校验器 Mongoose 作为 MongoDB 的异步对象建模库其数据数据库后端Gradle 工作校验Work Validation机制全解静态校验与运行时校验的源码级剖析Gradle 工作校验Work Validation机制全解静态校验与运行时校验的源码级剖析 本文以 Work Validation.md 为核心骨架结构建工具开发工具上一篇Draft.js Modifier 模块完全指南ContentState 编辑操作的 12 个静态方法下一篇5分钟免费搞定抖音无水印下载douyin-downloader终极完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考