如何在PHP中编写条件语句

来自菜鸟教程
跳转至:导航、​搜索

作者选择 Open Sourcing Mental Illness Ltd 作为 Write for DOnations 计划的一部分接受捐赠。

介绍

决定是生活中不可或缺的一部分。 从关于穿什么的平凡决定,到改变工作和家庭的生活决定。 在发展中也是如此。 为了让程序做任何有用的事情,它必须能够响应某种输入。 当一个人单击网站上的联系按钮时,他们希望被带到联系页面。 如果没有任何反应,或者他们被带到错误的页面,用户可以选择完全停止使用该网站或公司。

用代码编写的决策是使用条件句形成的:“如果 x,则 y”。 即使是按钮点击也是一种条件形式:“如果点击了此按钮,则转到某个页面。” 条件语句是计算机程序的逻辑、决策或流程控制的一部分。 您可以将条件语句与“选择自己的冒险”一书或流程图进行比较。

让我们看一些使用条件语句的例子:

  • 如果学生的考试成绩超过 65% o,则报告她的成绩通过; 如果不是,请报告她的成绩不及格。
  • 如果账户里有钱,计算利息; 如果透支,收取罚款。
  • 如果他们买了 10 个或更多的橙子,则计算 5% 的折扣; 如果他们买的少,那就不要。
  • 检查用户的位置并根据国家/地区显示正确的语言。
  • 在提交时发送表单,或在缺少必填字段旁边显示警告。
  • 在点击事件上打开下拉菜单,如果下拉菜单已经打开,则关闭它。
  • 显示酒店的预订表格,但如果酒店已预订则不显示。

在评估条件并根据是否满足这些条件来分配要运行的代码时,我们正在编写条件代码。

本教程将从概述将用于构建条件语句的比较运算符开始。 接下来,它将带您完成在 PHP 中编写条件语句,包括 ifelseelseif 关键字。 这还包括使用 andor 的逻辑运算符组合条件。 最后,它还将涵盖一些特殊的条件运算符,以更准确地描述一种情况。

比较运算符概述

条件语句评估条件是真还是假。 这通常是比较两个值的结果。 顾名思义,比较运算符用于比较两个值。 PHP 是一种 松散类型 语言,这意味着,默认情况下,PHP 将尽可能尝试更改数据类型以匹配预期结果。 这称为 类型杂耍,在使用比较运算符时变得非常重要。 例如,以下所有值都将被视为相等,即使它们属于不同类型:

false
0
0.0
''

PHP 提供了几个比较运算符来表达所需的值和类型/值组合的比较:

  • 平等的 == in 价值, after type juggling, meaning all of the values in the previous code block are equal.
  • 完全相同的 === in both 类型 and 价值, meaning none of the previous values are identical, because they are all of different types.
  • 不相等 != or <> in 价值, after type juggling. As the opposite of equal, comparing false != 0 would evaluate as false because the values match.
  • 不相同 !== in both 类型 and 价值. Comparing false !== 0 would evaluate to true because although the values evaluate the same, the type is different.

注意: 特别注意感叹号!,它的作用是否定其他条件。


除了相等和相同之外,PHP 还提供了比较运算符来表达值之间的关系。

  • 少于 < is used to show that 5 < 6 is true.
  • 比...更棒 > is used to show that 5 > 4 is true.
  • 小于或等于 <= is used so show that both 5 <= 5 and 5 <= 6 are true.
  • 大于或等于 >= is used to show that both 5 >= 5 and 5 >= 4 are true.

现在我们知道了比较运算符是什么,我们可以看看如何使用它们来编写条件语句。

编写条件语句

比较运算符与 ifelseelseif 关键字结合使用,以构建控制程序流程的条件语句。

使用 if 语句

当我们希望仅在满足条件时执行特定代码段时,我们使用条件语句 if,然后是括号中的条件 (),然后是要在花括号内执行的代码大括号 {}。 条件语句中的代码仅在条件计算为 true 时才会执行。 当条件不是 true 时,条件语句中的代码被忽略,在条件语句结束后继续处理。 让我们看看它在代码中的样子:

if ($inventory > 0) {
    echo "Add to Cart";
}

只有当变量 $inventory 包含大于 0 的数字时,才会显示字符串“添加到购物车”。

或者,如果条件后只有一个表达式,PHP 允许我们完全去掉花括号。 PHP 将执行条件后的第一个表达式,以分号结尾。 这包括它们之间的任何空格。 下面的评估方式与前面的示例相同:

if ($inventory > 0) echo "Add to Cart";

使用 else

当我们希望执行一段特定的代码或另一段时,我们将 else 块添加到条件 if 语句中。 if 块中的代码仅在语句计算结果为 true 时执行,而 else 块中的代码仅在语句不是 true。 让我们看一个示例,如果购物者购买 10 件或更多商品,他们将获得折扣:

if (count($cart) >= 10) {
    $discount = $subtotal * .3;
} else {
    $discount = 0;
}

当购物车中的商品数量大于或等于 10 时,语句计算结果为 true,并根据 $subtotal 计算折扣 30% is。 当购物车中的商品数量少于 10 件时,该语句的计算结果为 false 并执行 else 块,没有折扣。 比较也可以写成 count($cart) > 9

注意:计算百分比时不能使用百分号%,因为%是用来计算模数的,是$a的余数除以 $b3 % 8 = 2。 相反,要计算百分比,请将百分比除以 100 转换为小数。 所以 30%30/100,或 0.30,或 0.3。 有关更多信息,请查看 如何在 PHP 中使用数字。


添加 else 块有时会使代码更加混乱。 没有 else 块我们是否可以完成同样的事情是值得考虑的。 例如,前面的条件也可以写成如下:

$discount = 0;
if (count($cart) >= 10) {
    $discount = $subtotal * .3;
}

我们为折扣设置了默认值 0 并且仅在满足条件时更改它。

编写 elseif 语句

当需要第二个条件时,您可以添加第二个条件语句:

$discount = 0;
if (count($cart) >= 5) {
    $discount = $subtotal * .15
}
if (count($cart) >= 10) {
    $discount = $subtotal * .3;
}

当以这种方式添加第二条语句时,PHP 必须检查每条语句,即使第一条语句已经匹配。 如果购物车中有 14 件商品,第一个条件语句将计算为 true,因为 14 大于或等于 5,这会将折扣设置为 15%。 之后,第二个条件语句也将计算为 true,因为 14 也大于或等于 10,再次将覆盖该值的折扣设置为 30%。

如果条件的顺序不正确,这也可能最终返回错误的折扣。 当有可能匹配多个条件时,最好仔细检查您是否以正确的顺序评估这些条件。

使用 elseif 块可以更清晰地澄清和评估代码:

$discount = 0;
if (count($cart) >= 10) {
    $discount = $subtotal * .3;
} elseif (count($cart) >= 5) {
    $discount = $subtotal * .15
}

在这种情况下,代码首先检查大于或等于 10 的值。 如果第一个语句的计算结果为 true,则执行第一个条件块中的代码,并且永远不会计算其他条件语句。 只有当第一个条件不满足时,才会评估下一个条件。

一个条件语句可以有任意数量的 elseif 条件,但只有一个 else

嵌套条件语句

像嵌套娃娃一样,条件语句可能包含“嵌套”在其中的其他条件语句。 在嵌套条件语句时,使用一致的缩进极大地提高了可读性。 让我们扩展我们的折扣以提供更多选择:

$discount = 0;
if ($country === 'USA') {
    if (count($cart) >= 10) {
        if ($coupon_discount > .3) {
            $discount = $subtotal * $coupon_discount;
        } else {
            $discount = $subtotal * .3;
        }
    } elseif (count($cart) >= 5) {
        if ($coupon_discount > .15) {
            $discount = $subtotal * $coupon_discount;
        } else {
            $discount = $subtotal * .15
        }
    }
}

在此示例中,折扣仅适用于美国用户,因此在检查任何折扣之前,我们首先验证 $country 变量是否设置为 USA。 只有当第一个条件是 true 时,才会达到其余条件。

接下来我们检查购物车中的商品数量是否大于或等于 10。 如果第二个条件是 true,那么我们检查 $coupon_discount 的值是否大于订购 10 件或更多商品的正常 30% d 计数。 如果这第三个条件是 true,则使用 $coupon_discount 计算 $discount。 否则,这第三个条件是false,然后用正常的30%来计算折扣。

这将我们带到第二个条件的 else 块。 不只是 elseelseif 块用于验证购物车中的商品数量是否大于或等于 5,然后再提供二次折扣选项。 我们再次检查 $coupon_discount 变量中的值是否大于 15% 的二级批量折扣。 如果这第四个条件为真,则 $coupon_discount 用于计算 $discount。 否则,这第四个条件是 false,那么我们就达到了最后的 15% 折扣。

嵌套条件语句,就像我们刚刚看到的那样,很难理解,尤其是当你开始添加额外的级别时。 如果可能,请考虑如何重写条件语句以删除嵌套。 前面的条件也可以写成如下:

$discount = 0;
if ($country !== 'USA') {
    // no discount for non-us locations
} elseif ($coupon_discount > .3) {
    $discount = $subtotal * $coupon_discount;
} elseif (count($cart) >= 10) {
    $discount = $subtotal * .3;
} elseif ($coupon_discount > .15) {
    $discount = $subtotal * $coupon_discount;
} elseif (count($cart) >= 5) {
    $discount = $subtotal * .15;
}

因为 PHP 允许一个空的条件块,我们可以先检查国家并跳过任何其他条件。 请注意否定表达式 !== 表示国家与值 USA 不匹配。 尽管您可以将一个块完全留空,但添加注释说明了将该块留空的意图。

对于 elseif 块,我们从最严格的开始,然后一路向下。 在美国,有人持有价值 20% (.2) 的优惠券,前 3 个区块的计算结果为 false。 然后它们将到达第三个 elseif,其计算结果为 true,因为 .2 大于 0.15。 将计算折扣并传递最终条件块。

替代语法

条件语句最常见的语法是使用花括号,如前面的示例所示。 PHP 确实提供了一种替代语法,当每个条件之间有长代码块时,或者当在条件中使用也使用花括号的循环时,它可以使事情更容易阅读。 这种替代语法是在条件语句之后使用冒号编写的,并使用 endif; 语句结束条件块。 折扣示例可以使用这种替代语法编写,如下所示:

$discount = 0;
if ($country !== 'USA'):
    // no discount for non-us locations
elseif ($coupon_discount > .3):
    $discount = $subtotal * $coupon_discount;
elseif (count($cart) >= 10):
    $discount = $subtotal * .3;
elseif ($coupon_discount > .15):
    $discount = $subtotal * $coupon_discount;
elseif (count($cart) >= 5):
    $discount = $subtotal * .15;
else:
    $discount = $subtotal * .05;
endif;

虽然在这些条件块中嵌套循环是可以接受的,但在这些条件块中嵌套花括号条件可能会导致意外结果。 最好使用花括号或冒号。

注意: 由于 PHP 处理空格的方式,当使用大括号时,它将接受 elseif 之间的空格:} else if (...){。 但是,如果在使用冒号定义语句时使用空格,PHP 将失败并出现解析错误:elseif (...):。 在实践中,避免空格并始终将其写为单个 elseif 是个好主意。


其他比较运算符

在每个条件语句中使用单个比较运算符并不是使用比较运算符的唯一方法。 我们不仅可以组合条件,还可以在条件之外使用比较运算符。

使用逻辑运算符组合条件

当有多个条件都需要为真或多个条件具有相同影响时,可以使用逻辑运算符将条件语句组合成一个块。

  • and says that both conditions must be true.
  • 或者 or says that either condition is true or they could both be true.
  • 异或 xor says that only one of the conditions is true.
  • 不是 ! is used to negate a condition, which changes it from evaluating true to evaluating false.
  • && says that both conditions must be true.
  • 或者 || says that either condition is true or they could both be true.

运算符的两种不同变体的原因是它们以不同的优先级运行。 运算符的优先级指定了它将两个表达式“紧密”绑定在一起的程度,或者操作的计算顺序。 (参见运算符优先级文档。)任何一种方式都是完全可以接受的,并且在大多数情况下都一样。 PHP 中的运算符不区分大小写,这意味着运算符也可以写成 OR(甚至是 OroR,我都不推荐)。 为了最大程度地减少混淆,最重要的是无论您选择哪种方式都要保持一致。 我将在示例中使用 andor,因为它们更易于阅读。

在折扣示例中使用它:要检查 $country 变量是否设置为 USA 并且购物车中的商品大于或等于 10,可以使用以下条件组合这些条件and 运算符:

$discount = 0;
if ($country === 'USA' and count($cart) >= 10) {
    $discount = $subtotal * .3;
}

该示例有两个条件 $country === 'USA'count($cart) >= 10。 如果这两个条件都为 true,则该块中的代码将被执行。 此示例使用 and 运算符,但也可以使用 AND 甚至 && 运算符,结果完全相同。

我们还可以组合必须得到相同结果的条件。 如果购物车中有 10 件或更多商品会产生 30% 的折扣,或者小计为 100 美元或更多也会产生 30% 的折扣,则可以组合这些条件:

$discount = 0;
if (count($cart) >= 10 or $subtotal >= 100) {
    $discount = $subtotal * .3;
}

也可以组合两个以上的条件; 但是,在使用它们时要格外小心。 让我们尝试将国家评估与购物车数量和小计比较结合起来:

# BAD
$discount = 0;
if ($country === 'USA' and count($cart) >= 10 or $subtotal >= 100) {
    $discount = $subtotal * .3;
}

这个例子实际上并没有按照预期的方式工作,因为首先使用购物车的数量评估国家/地区,然后使用 or 对小计比较评估该结果。 这意味着无论国家或计数值是什么,如果 $subtotal 大于或等于 100,则完整的条件语句将计算为 true

括号可用于确保按预期顺序评估条件:

$discount = 0;
if ($country === 'USA' and (count($cart) >= 10 or $subtotal >= 100)) {
    $discount = $subtotal * .3;
}

现在,在使用该结果评估国家/地区之前,使用小计比较评估购物车计数。 这提供了要求 $country 具有 USA 的值的期望结果,然后购物车的计数或小计的比较(或两者)也必须评估为 [ X196X]。

有时不需要整个条件块来比较两个值。 PHP 提供了一些速记比较运算符来更准确地描述一种情况。

三元运算符

当一个表达式为真时应该有一个结果,如果同一个表达式为假时应该有另一个结果,则可以使用 三元运算符 。 如果 expr1 计算结果为 true,则表达式 (expr1) ? (expr2) : (expr3) 计算结果为 expr2,如果 expr1 计算结果为 false。 假设访问者的用户名应该显示为 if 他们已登录,而如果没有,则应显示“Guest”一词。 函数 isset 将帮助我们评估这种情况,因为它会检查变量是否已实际定义。 如果定义了变量,isset返回true; 如果不是,isset 返回 false

echo (isset($username)) ? 'Guest' : $username;

这与 if/else 语句相同:

if (isset($username)) {
    echo 'Guest';
} else {
    echo $username;
}

可以省略三元运算符的中间部分。 如果 expr1 计算结果为真,则表达式 expr1 ?: expr3 返回 expr1,否则返回 expr3。 要显示用户名或单词“Guest”,三元运算符看起来像:

echo $username ?: 'Guest';

如果 $username 设置为空字符串,则此方法有效,但如果根本未设置 $username,则会出现错误。 在这种情况下不能使用 isset 函数,因为 isset($username) 的输出将是 truefalse,而不是 $username。 这将我们带到了下一个运算符。

空合并运算符

空合并运算符 (??) 已添加为“语法糖”(有但不是必需的),用于需要将三元与 isset() 结合使用的常见情况。 如果存在且不为空,则返回其第一个操作数; 否则返回第二个操作数。 要显示用户名或单词“Guest”,请使用空合并运算符:

echo $username ?? 'Guest';

宇宙飞船操作员

宇宙飞船运算符 (<=>) 用于比较两个表达式:$a <=> $b。 当 $a 分别小于 (<)、等于 (=) 或大于 (>) 时,它返回 -1、0 或 1 ) $b

echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1

警告:虽然spaceship算子不经常使用,但在编写“用户自定义排序”(usort)函数时,它会派上用场。 以下示例包含您可能还不熟悉的其他概念。 如果您现在不遵循所有代码,请不要担心。 我将解释示例中发生了什么,我们将在后面的教程中更深入地介绍这些概念。


让我们创建一系列新产品。 反过来,数组中的每个产品都将是其自己的嵌套产品属性数组:

$products = [
    ['name'=>'Flippers', 'price'=>7.99],
    ['name'=>'Wet Suit', 'price'=>18.99),
    ['name'=>'Snorkel', 'price'=>2.99),
    ['name'=>'Mask', 'price'=>6.99),
];

现在假设我们要按每个项目的价格降序对这个 $products 数组进行排序。 我们可以通过使用 usort 函数来做到这一点,然后我们将处理排序逻辑的匿名函数传递给该函数。 让我们看一下代码:

usort($products, function($item1, $item2) {
    return $item2["price"] <=> $item1["price"];
});

usort 函数有两个参数(传递给函数的值)。 第一个参数是 $products 数组。 第二个是 匿名函数 ,它告诉 usort 函数如何处理数组中的每个项目。 如果 $item2 的价格小于 $item1 的价格,则运算符将返回 -1,将 $item2 移动到 $item1 之前. 如果价格相同,则运算符将返回 0,这将使商品保持相同的顺序。 最后,如果 $item2 的价格大于 $item1 的价格,则运算符将返回 1,这会将 $item2 放在 [ 之后X155X],这又是他们开始的顺序。

要改为按价格升序排序,我们翻转 $item1$item2 的位置,这会改变比较的顺序:

usort($products, function($item1, $item2) {
    return $item1["price"] <=> $item2["price"];
});

结论

条件语句为我们提供了流控制来确定程序的输出选择。 它们是编程的基础构建块之一,几乎可以在所有编程语言中找到。

本教程涵盖了用于比较值的比较运算符和用于组合条件的逻辑运算符。 它在查看嵌套语句和组合条件时演示了 ifelseelseif 关键字的使用。 最后介绍了其他比较运算符的使用,包括三元运算符、空合并运算符和宇宙飞船运算符。 继续练习条件语句:

  • 尝试使用不同的运算符:<>=====
  • 将运算符与 andor 组合
  • 使用三元、空值合并或宇宙飞船运算符重新创建 if 语句

有关如何在 PHP 中编码的更多信息,请查看 如何在 PHP 系列中编码的其他教程。