PHP中无需in_array的多条件变量测试简写方案?含JS场景
单变量多条件链式判断的PHP/JS实现方案
PHP 解决方案
1. 自定义链式判断辅助函数
封装一个轻量函数,传入变量后通过链式调用完成多条件验证,彻底避免重复书写长变量名:
function validate($value) { return (object) [ // 验证变量已设置 'isSet' => function() use ($value) { return isset($value) ? (object) ['and' => fn() => validate($value)] : false; }, // 验证非Null 'notNull' => function() use ($value) { return $value !== null ? (object) ['and' => fn() => validate($value)] : false; }, // 验证等于指定值 'equals' => function($target) use ($value) { return $value === $target; } ]; } // 使用示例(长变量:$this->user->profile->preferredPaymentMethod) if (validate($this->user->profile->preferredPaymentMethod)->isSet()->and()->notNull()->and()->equals('credit_card')) { // 执行业务逻辑 }
每个判断方法通过后,调用and()可以继续链式验证,最后用equals()返回最终布尔值,中途任意条件不满足则返回false。
2. 原生语法紧凑写法(PHP 8+)
无需额外封装,利用括号赋值一次性获取变量,后续用短变量完成判断:
// 场景1:变量已存在,仅需验证非Null+指定值 if (($v = $this->user->profile->preferredPaymentMethod) !== null && $v === 'credit_card') { // 执行逻辑 } // 场景2:需要先验证变量已设置 if (isset($this->user->profile->preferredPaymentMethod) && ($v = $this->user->profile->preferredPaymentMethod) !== null && $v === 'credit_card') { // 执行逻辑 }
这种方式没有额外函数开销,代码简洁,临时变量$v仅作用于当前判断逻辑,不会造成函数内变量混乱。
3. 闭包临时验证器
如果不想定义全局辅助函数,可在函数内部临时创建闭包:
$check = fn($val) => (object)[ 'pass' => fn($condition) => $condition($val) ? $check($val) : false, 'end' => fn() => true ]; // 使用示例 if ($check($this->user->profile->preferredPaymentMethod) ->pass(fn($v) => isset($v)) ->pass(fn($v) => $v !== null) ->pass(fn($v) => $v === 'credit_card') ->end() ) { // 执行逻辑 }
pass()接收自定义判断闭包,通过后返回自身继续链式调用,end()返回true确认所有条件通过。
JavaScript 解决方案
JS原生语法对链式判断支持更友好,以下是几种实用方式:
1. 可选链+括号赋值(ES6+)
利用可选链?.处理变量不存在的情况,结合括号赋值避免重复变量:
// 长变量:user.profile.preferredPaymentMethod if ((v = user?.profile?.preferredPaymentMethod) !== null && v === 'credit_card') { // 执行逻辑 }
user?.profile?.preferredPaymentMethod会自动处理层级中任意变量不存在的情况(返回undefined),后续判断!== null同时覆盖了存在且非Null的场景。
2. 自定义链式验证函数
和PHP思路类似,封装工具函数实现链式调用:
function validate(value) { return { isDefined: () => value !== undefined ? validate(value) : false, notNull: () => value !== null ? validate(value) : false, equals: (target) => value === target } } // 使用示例 if (validate(user?.profile?.preferredPaymentMethod).isDefined().notNull().equals('credit_card')) { // 执行逻辑 }
3. 数组every批量验证
将所有判断条件存入数组,通过every方法批量验证,变量仅需传入一次:
const v = user?.profile?.preferredPaymentMethod; const isValid = [ () => v !== undefined, () => v !== null, () => v === 'credit_card' ].every(fn => fn()); if (isValid) { // 执行逻辑 }
这种方式适合条件较多的场景,所有判断逻辑清晰罗列,可读性强。
内容的提问来源于stack exchange,提问作者Jim Nayzium
相关产品推荐
相关产品推荐

