← PHP注释:被低估的代码维护利器 PHP Switch条件判断 →

PHP条件语句:让代码学会“做判断”

原创 2026-05-09 PHP 已有人查阅

程序之所以“智能”,核心就在于它能根据不同条件执行不同的逻辑。PHP提供了ifelseifelse三个语言结构来实现条件分支控制。所谓语言结构,指的是它们不是函数,而是PHP解析器直接能识别的语法单元,执行效率比调用函数更高。

这三个关键字组合出四种主要形态:单路判断的if、二选一的if-else、多路选择的if-elseif-else,以及层层筛选的嵌套if。下面逐一拆解。

一、if语句:条件为真才执行

if是最基础的条件语句。当括号里的条件表达式结果为true时,花括号里的代码块才会被执行;如果条件为false,整个代码块直接跳过。

语法结构:

if (条件表达式) {
    // 条件成立时执行的代码
}

示例:

<?php
$studentScore = 85;

if ($studentScore >= 60) {
    echo "恭喜,成绩合格!\n";
    echo "你的分数是:{$studentScore}分";
}
// 输出:恭喜,成绩合格!
//       你的分数是:85分
?>

条件表达式可以是一个变量、一个比较运算、一个函数调用返回的布尔值,只要最终能转成布尔类型就行。值得留意的是,PHP里数字0、空字符串''、空数组[]null都会被视为false,其他值基本都算true

二、if-else语句:二选一的岔路口

现实场景中往往需要处理条件不成立的情况,if-else就是为这个而生的。条件为真走if分支,为假走else分支,两条路必走其一。

语法结构:

if (条件表达式) {
    // 条件成立
} else {
    // 条件不成立
}

示例:

<?php
$loginAttempts = 4;
$maxAttempts = 5;

if ($loginAttempts < $maxAttempts) {
    echo "登录尝试次数:{$loginAttempts},还可以继续尝试";
} else {
    echo "登录尝试次数已达上限,账号已锁定,请联系管理员";
}
// 输出:登录尝试次数:4,还可以继续尝试
?>

本节课程知识要点if-else是二元分支,别在else里再写一个相反的if去做判断——那是elseif该干的事。如果ifelse里只有一行代码,花括号在语法上可以省略,但建议始终保留花括号。省略括号在后期加代码时容易引发逻辑错误,这是我从多次调试经历里出来的教训。

三、if-elseif-else语句:多路选择的分发器

当判断条件超过两个,if-else就不够用了。这时elseif登场,它允许你在一个结构里串联多个条件,从上到下依次检查,遇到第一个为true的条件就执行对应代码块,然后跳出整个结构,不再继续判断后续条件。

语法结构:

if (条件1) {
    // 条件1成立
} elseif (条件2) {
    // 条件1不成立但条件2成立
} elseif (条件3) {
    // 前面都不成立但条件3成立
} else {
    // 所有条件都不成立
}

示例:

<?php
$courseProgress = 72;  // 课程进度百分比

if ($courseProgress == 0) {
    echo "尚未开始学习,快去选课吧";
} elseif ($courseProgress < 30) {
    echo "学习进度:{$courseProgress}%,刚起步,继续加油";
} elseif ($courseProgress < 60) {
    echo "学习进度:{$courseProgress}%,已过半程,保持节奏";
} elseif ($courseProgress < 100) {
    echo "学习进度:{$courseProgress}%,冲刺阶段,善始善终";
} else {
    echo "课程已完成,可以领取证书";
}
// 输出:学习进度:72%,冲刺阶段,善始善终
?>

个人经验分享elseif的条件顺序很重要。PHP从上往下匹配,一旦命中就不再检查后面的条件。所以要把范围更精确、更严格的条件放在前面,把宽泛的兜底条件放在后面。以上面的例子来说,如果我把$courseProgress < 100放在$courseProgress < 60前面,那么72会先命中< 100这个条件,到不了后面的细分区间。设计elseif链路时,要么从大到小排,要么从小到大排,保持一致的方向性,阅读和维护时才不容易混乱。

另外注意PHP里elseifelse if(中间有空格)都能用,但elseif是标准的语言结构写法,感觉更紧凑。我个人在团队规范里统一要求用elseif,避免因空格这类细节造成代码风格上的不一致。

四、嵌套if语句:条件里的条件

嵌套if是指在一个if代码块内部再放一个if语句。它用来表达“在某个前提条件满足的情况下,再做进一步的细分判断”。

语法结构:

if (外层条件) {
    // 外层条件成立
    if (内层条件) {
        // 内外层都成立
    } else {
        // 外层成立但内层不成立
    }
}

示例1:多条件联合校验

<?php
$userAge = 23;
$userNationality = "Indian";

if ($userNationality == "Indian") {
    if ($userAge >= 18) {
        echo "具备投票资格";
    } else {
        echo "国籍符合,但年龄未满18岁,不具备投票资格";
    }
} else {
    echo "非本国公民,不具备投票资格";
}
// 输出:具备投票资格
?>

上面的例子中,国籍是前置条件,只有国籍符合了才继续判断年龄。这种写法在权限校验、表单验证等场景里很常见。

示例2:数值比较中的嵌套

<?php
$a = 34;
$b = 56;
$c = 45;

if ($a < $b) {
    if ($a < $c) {
        echo "{$a} 比 {$b} 和 {$c} 都小";
    }
}
// 输出:34 比 56 和 45 都小
?>

本节课程知识要点:嵌套层级不要过深。如果if里面套if再套if,三层以上阅读起来就会吃力。遇到这种情况,考虑以下几种重构思路:

  • 把内层逻辑抽成一个独立的函数,用函数名来表达意图

  • &&||把多个条件合并,减少嵌套

  • switch结构替代多层elseif嵌套

  • 提前return或用continue/break来扁平化结构

// 重构前:三层嵌套
if ($isLogin) {
    if ($isVip) {
        if ($orderTotal > 100) {
            // 打折逻辑
        }
    }
}

// 重构后:扁平化+提前退出
if (!$isLogin || !$isVip || $orderTotal <= 100) {
    return;
}
// 打折逻辑
?>

提前把不符合条件的情况拦截掉,剩下的就是纯粹的核心逻辑。这种“卫语句”写法能有效减少嵌套层级,是我在重构老代码时常用的手法。

五、if-elseif与switch的抉择

说到多条件判断,很多人会想到switch语句。二者的适用场景有一个比较实用的区分标准:

  • 当所有条件都在判断同一个变量的不同取值时,switch更直观

  • 当条件之间涉及不同的变量或者范围判断(大于、小于、区间)时,if-elseif更适合

// 适合switch的场景:判断同一变量的具体值
$role = "editor";
switch ($role) {
    case "admin":
        echo "全部权限";
        break;
    case "editor":
        echo "编辑权限";
        break;
    default:
        echo "访客权限";
}

// 适合if-elseif的场景:涉及范围判断
if ($score >= 90) {
    echo "A+";
} elseif ($score >= 80) {
    echo "A";
} elseif ($score >= 70) {
    echo "B";
}

个人建议:不要在switchif-elseif之间来回切换重构,除非逻辑真的更适合另一种。两者各有所长,选谁取决于语义清晰度。我见过有同事硬把范围判断塞进switch里,用true当switch的参数然后各个case写$score >= 90这样的表达式,虽然语法上可行,但读起来别扭,不如老老实实用if-elseif来得直接。

六、条件语句中的常见

一:赋值和比较混淆

// 错误:= 是赋值,不是比较
if ($status = "active") {
    // 这里成立,因为赋值的返回值是"active",转布尔为true
}

// 正确:== 或 === 才是比较
if ($status === "active") {
    // 这才是判断$status是否等于"active"
}

这种笔误调试起来很痛苦,因为你一眼扫过去可能看不出===的区别。有个小技巧是把常量写在前面:if ("active" === $status),如果写成"active" = $status会直接报语法错误,能第一时间发现。

二:忽略else分支
else不是必须写的,但如果条件判断涉及状态分支,很好明确写出else,哪怕里面只有一个注释说明“此情况不做处理”。这能向后来阅读代码的人传达一个信号:这个分支我考虑过了,并非遗漏。

PHP条件语句本身语法不复杂,真正的难度在于如何根据业务逻辑设计清晰的条件结构,以及写出易于维护的判断链路。把条件顺序理清楚、嵌套层次控制好、分支覆盖完整,就能让代码既正确又易读。

← PHP注释:被低估的代码维护利器 PHP Switch条件判断 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号