ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Validation 库 StringType 验证器完全指南:严格校验 PHP 字符串类型的正确姿势

Validation 库 StringType 验证器完全指南:严格校验 PHP 字符串类型的正确姿势 后端开发工具【免费下载链接】ValidationThe most awesome validation engine ever created for PHP项目地址https://gitcode.com/gh_mirrors/va/Validation点击查看免费下载导读StringType是 PHP 验证库 Validation 中用于严格校验输入是否为 string 原生类型的核心验证器。它直接基于 PHP 的is_string()判定不做任何隐式类型转换——这与同名的StringVal形成鲜明对比。读完本文你将掌握StringType的调用方式、底层实现原理、模板消息定制方法以及它与StringVal、Alnum等相邻验证器的取舍原则能够在数据入口处精准拦截非字符串数据。StringType()严格模式下的字符串类型校验在 docs/validators/StringType.md 中StringType的定位被一句话点明Validates whether the type of an input is string or not.即验证输入的类型是否为字符串。这里的类型是严格的 PHP 原生类型type而不是能否被当作字符串使用value。两种理念分别对应StringType与StringVal是理解本验证器的关键分界线。它的 API 极简构造无需任何参数StringType()最基础的调用示例v::stringType()-assert(hi); // Validation passes successfully当输入确实是字符串时验证通过当输入是整数、浮点数、布尔值、数组、对象或null时验证失败并抛出ValidationException。底层原理一个is_string()加上 PHP 8 原生属性从源码看StringType的实现极其精简完整逻辑只有一行src/Validators/StringType.php#[Attribute(Attribute::TARGET_PROPERTY | Attribute::IS_REPEATABLE)] #[Template( {{subject}} must be a string, {{subject}} must not be a string, )] final class StringType extends Simple { public function isValid(mixed $input): bool { return is_string($input); } }值得注意的三个实现细节判定逻辑即is_string()is_string只对 PHP 原生string类型返回true。空字符串、包含数字的字符串165.7都算字符串而null、数组、对象、整数一概被拒绝绝无类型转换的空间。继承自Simple抽象基类src/Validators/Core/Simple.php 定义了验证器的最小契约——子类只需实现isValid(mixed $input): bool基类会自动通过Result::of()将布尔结果包装成Result对象供assert、check、validate等高层 API 消费。#[Attribute]声明StringType被标记为可重复使用的 PHP 属性IS_REPEATABLE目标为属性TARGET_PROPERTY这意味着它可以直接作为注解用在类属性上以声明式的方式驱动属性验证。完整调用链从高层 API 到底层判定的调用链路为v::stringType() // 通过 ValidatorFactory 构造验证器实例 - assert($input) // 调用 evaluate() 求值 - Simple::evaluate() // 包装 isValid() 的布尔结果 - StringType::isValid() // is_string($input)严格类型与值语义的分水岭StringType vs StringVal这是本主题最容易踩坑的地方。StringType校验是不是string 类型而StringVal校验能不能用作字符串。对比 src/Validators/StringVal.php 的实现public function isValid(mixed $input): bool { return is_scalar($input) || (is_object($input) method_exists($input, __toString)); }两者行为对照如下均以assert()为例输入v::stringType()v::stringVal()hi//165.7✅ 通过✅ 通过42/1.0/true/false❌ 拒绝✅ 通过标量可转字符串带__toString()的对象❌ 拒绝✅ 通过null/[]/stdClass❌ 拒绝❌ 拒绝选择原则很简单如果你要求数据必须是字符串这种数据类型用StringType如果你只是要求数据能安全地转成字符串如表单提交的42、数字、布尔值用StringVal。两者的模板消息恰好相同都是{{subject}} must be a string但判定语义完全不同详见 StringVal 文档。错误消息与反向断言assert的完整行为验证仓库中的功能测试 tests/feature/Validators/StringTypeTest.php 给出了断言失败时的真实消息格式// Scenario #1非字符串输入触发断言异常 v::stringType()-assert(42); // 异常消息42 must be a string // Scenario #2反向断言 v::not(v::stringType())-assert(foo); // 异常消息foo must not be a string // Scenario #3布尔值输入完整消息含行首连字符 v::stringType()-assert(true); // 完整消息- true must be a string // Scenario #4反向断言完整消息 v::not(v::stringType())-assert(bar); // 完整消息- bar must not be a string这些用例直观展示了两个实用技巧使用v::not()反转语义v::not(v::stringType())表示输入必须不是字符串适合排除字符串类型的场景消息格式自适应字符串输入在消息中被双引号包裹foo布尔值则用反引号包裹true数字直接裸写42可读性很强。单元测试 tests/unit/Validators/StringTypeTest.php 进一步给出了官方认可的合法/非法输入边界判定输入✅ 合法空字符串、165.7数字形态的字符串❌ 非法null、[]空数组、new stdClass()、150整数注意即使字符串内容长得像数字165.7只要它是 string 类型就通过——StringType只看类型不看内容。若想同时约束内容的数字格式请叠加NumericVal、Decimal等验证器见 validators 总览。模板与占位符定制失败消息与 v3 的所有验证器一致StringType通过#[Template]属性声明了两套标准消息模板TEMPLATE_STANDARD模式模板default{{subject}} must be a stringinverted{{subject}} must not be a string其中唯一的占位符为占位符说明subject被验证的输入值若指定了自定义验证器名称则为该名称占位符使用{{与}}包裹渲染时由Respect\StringFormatter的PlaceholderFormatter负责把真实参数值转换成字符串并替换参见 docs/messages/placeholder-conversion.md。这意味着你可以通过 模板机制 将默认英文消息替换为自定义文案例如把{{subject}} must be a string改成业务化的中文提示占位符{{subject}}依然会被真实输入值填充。历史沿革从String到StringType文档的 Changelog 记录了该验证器的演进版本说明1.0.0由String更名为StringType0.3.9最初以String名称创建更名是为了与类型校验类验证器如ArrayType、BoolType、IntType形成一致的命名体系——所有*Type后缀验证器都代表严格类型检查这是 Validation 命名规范的重要约定StringType归入Strings与Types两个分类。小结StringType是 Validation 库中最纯粹的类型断言验证器一行is_string()实现严格字符串判定配合v::not()支持反向断言通过#[Template]支持消息定制且可作为 PHP 8 属性注解直接用于类属性校验。在实际项目中请牢记它与StringVal的语义差别并在需要内容级校验时与其他验证器如Alnum、Length、Regex组合使用构建完整的数据校验链路。相关验证器Alnum — 字母数字校验ArrayType — 严格数组类型BoolType — 严格布尔类型BoolVal — 布尔值语义CallableType — 可调用类型FloatType — 严格浮点类型IntType — 严格整数类型NullType — 严格 null 类型Number — 数值校验ObjectType — 严格对象类型ResourceType — 严格资源类型ScalarVal — 标量值语义StringVal — 字符串值语义StringType的姊妹验证器赞分享后端开发工具【免费下载链接】ValidationThe most awesome validation engine ever created for PHP项目地址https://gitcode.com/gh_mirrors/va/Validation点击查看免费下载相关推荐Respect\Validation 中的 BoolType 验证器严格校验 PHP 布尔类型Respect\Validation 中的 BoolType 验证器严格校验 PHP 布尔类型 Respect\Validation 是 PHP 生态中一个以后端开发工具Respect Validation FloatType 验证器PHP 浮点类型严格校验的完整实践指南Respect Validation FloatType 验证器PHP 浮点类型严格校验的完整实践指南 导读 FloatType 是 Respect Vali后端开发工具Validation 框架 Positive 验证器完全指南判定正数输入的正确姿势Validation 框架 Positive 验证器完全指南判定正数输入的正确姿势 本指南围绕 PHP 验证框架 Respect Validation 中的后端开发工具上一篇rffmpeg安装与配置指南下一篇【亲测免费】 scikit-uplift 项目教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进