wave validation 是某国产低代码平台或项目私有封装的链式校验工具,并非 php 官方或主流开源组件;其核心是通过方法返回 $this 实现链式调用,规则延迟至 validate() 才执行,强调可复用与组合性。

Wave Validation 是什么,它和 PHP 原生校验有啥区别
Wave Validation 不是 PHP 官方组件,也不是 Composer 上广泛使用的主流库(比如 respect/validation 或 symfony/validator),目前没有稳定、被广泛收录的开源包叫这个名字。搜 Wave Validation,常见结果是某国产低代码平台的私有校验模块,或个别项目内部封装的工具类,没有统一接口规范。
如果你在某份文档、框架文档或同事代码里看到 Wave Validation,大概率是指一个自定义的、支持链式调用的校验器类,类似这样:$v->required()->email()->max(255)。它本身不是语言特性,而是开发者写的封装逻辑。
怎么自己写一个轻量链式校验器(PHP 8.0+)
真要实现链式规则校验,不用依赖未知第三方,几行代码就能搭出可用骨架。核心是让每个校验方法返回 $this,并把错误信息存起来,最后统一判断。
常见错误现象:Fatal error: Uncaught Error: Call to a member function email() on null —— 没有在每个方法末尾写 return $this;;或者忘了初始化错误数组,导致 validate() 返回空却没报错。
- 校验方法必须返回
$this,否则链式中断 - 所有规则只做“登记”,不立即执行;
validate($data)才真正跑一遍 - 注意
isset()和empty()的语义差异:required()应该检查array_key_exists()+!is_null(),而不是简单用empty() - 字符串长度用
mb_strlen(),避免中文算成多个字符
class WaveValidator {
private array $rules = [];
private array $errors = [];
public function required(): self {
$this->rules[] = fn($v) => isset($v) && !is_null($v) ?: '必填';
return $this;
}
public function email(): self {
$this->rules[] = fn($v) => filter_var($v, FILTER_VALIDATE_EMAIL) ?: '邮箱格式错误';
return $this;
}
public function max(int $len): self {
$this->rules[] = fn($v) => is_string($v) && mb_strlen($v) errors = [];
foreach ($this->rules as $rule) {
$result = $rule($value);
if ($result !== true) $this->errors[] = $result;
}
return empty($this->errors);
}
public function getErrors(): array {
return $this->errors;
}
}
为什么别直接在构造函数里传值校验
链式校验的价值在于「规则可复用、可组合」。如果一创建实例就立刻校验,比如 new WaveValidator($input['email'])->required()->email(),会导致两个问题:
- 无法动态增删规则:比如表单字段是否必填,取决于另一个字段的值(如“支付方式=银行卡”时才校验卡号),硬编码进构造器就僵了
- 无法延迟执行:你可能想先收集所有字段的校验器,再统一跑一遍,方便批量收集错误
- 测试困难:构造即执行,mock 和断言都变重
正确姿势是分离「定义」和「执行」:先构建规则链,最后统一 validate($data)。
兼容性与性能要注意的点
PHP 8.0+ 支持箭头函数和联合类型,上面示例用 fn() 写法干净;若需兼容 7.4,把闭包改成 function ($v) { ... } 即可,但记得 use ($this) —— 不过这会破坏链式返回 $this,所以 7.4 更推荐传统方法体写法。
性能上,10 条以内规则几乎无感;但若规则里含正则(如复杂密码策略)、远程请求(如用户名是否已存在)、文件读取等,务必意识到这些操作是在 validate() 时同步执行的,会阻塞。这类规则不该塞进链式校验器,而应单独处理。
容易被忽略的是错误信息的上下文:当前示例只返回字符串,实际项目中建议返回带字段名的结构化错误,比如 ['email' => ['邮箱格式错误']] ,否则前端很难准确定位到哪个输入框。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











