用$isAdmin*$isLogin*$isConfirmed判假替代if语句是否为良好实践?
使用乘法运算检测多变量假值不属于良好编码实践
你给出的乘法写法如下:
return $isAdmin * $isLogin * $isConfirmed;
该写法试图替代的判断逻辑为:
if (!$isAdmin | !$isLogin | !$isConfirmed) { return false; }
结论非常明确:这是非常糟糕的编码实践,绝对不要在正式项目里使用,核心原因如下:
- 隐式类型转换会带来不可控的逻辑bug:PHP执行算术乘法时,会自动将所有参与运算的值转为整型/浮点型,布尔值
true转1、false转0,看似结果刚好符合“全为真才返回1,有假值就返回0”的预期,但只要变量不是严格的布尔类型,结果就会完全失控。比如老代码里从数据库读出来的状态字段经常是字符串类型:$isConfirmed = "2"(表示已认证),乘法结果会变成2而非布尔true,后续如果用=== true做严格判断就会出错;更危险的是如果$isConfirmed = "false"(字符串格式的假值),PHP会把非空字符串转为1,乘法结果为1直接返回真,会直接造成权限绕过这类严重安全问题。 - 可读性极差,徒增维护成本:代码首先是写给人看的,其次才是给机器执行的。任何开发者看到乘法运算符的第一反应是做数值计算,根本不会立刻联想到这是在做布尔逻辑校验,后续接手维护的人需要额外花费精力猜测这段“黑话”的意图,平白增加维护成本。
- 语义完全错位:你要实现的“所有条件都满足才返回真”是最典型的逻辑与场景,PHP原生就提供了语义清晰、无额外副作用的逻辑与运算符,完全没必要用算术运算取巧模拟。
- 顺带一提,你给出的参考if写法本身也存在问题:代码里用的
|是按位或运算符,不是逻辑或||,虽然对纯布尔值来说运行结果碰巧一致,但遇到非布尔类型的变量时,按位运算会产生完全不符合预期的结果,同样不推荐使用。
你要实现的需求,最规范、最清晰、没有任何副作用的写法只需要一行:
return $isAdmin && $isLogin && $isConfirmed;
这段代码没有多余的类型转换,语义直白到任何有基础PHP开发能力的人扫一眼就能懂:三个条件同时为真才返回真,只要有一个假值就返回假,完全匹配你的需求,没有任何取巧带来的隐患。
内容的提问来源于stack exchange,提问作者AirQ
相关产品推荐
相关产品推荐

