如何在PHP中编写条件语句

引言

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

在代码中编写决策时使用的是条件语句:“如果x,则y”。即使是单击一个按钮,也是一种条件语句:“如果单击该按钮,则跳转到某个页面。”条件语句是计算机程序逻辑、决策或流程控制的一部分。你可以把条件语句比作一本“选择你自己的冒险”的书或流程图。

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

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

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

本教程将首先概述用于构建条件语句的比较运算符。接下来,它将带你使用PHP编写条件语句,包括ifelseelseif关键字。这也包括使用逻辑运算符and or or来组合条件。最后还会介绍一些特殊的条件运算符,以更精确地描述一种情况。

比较操作符概述

条件语句(conditional statement)计算一个条件是否为true或false。这通常是两个值比较的结果。顾名思义,比较操作符用于比较两个值。PHP是一种* 松散类型 *语言,这意味着默认情况下,PHP将尝试更改数据类型以匹配预期结果。这被称为类型杂耍,在使用比较操作符时变得非常重要。例如,以下所有值都被认为是相等的,尽管它们的类型不同:

false
0
0.0
''

PHP提供了一些比较操作符来表达对value和type/value组合的所需比较:

  • ==是在类型相等,在类型更改之后,意味着前一个代码块中的所有值都是相等的。
  • ===是在类型中都是相同的,这意味着前面的值都不相同,因为它们都是不同的类型。
  • !=<>不相等的,类型变换。作为相等的反义词,比较false != 0会被判定为false,因为两个值是匹配的。
  • !==是在类型中都不相同的。比较false !== 0会被求值为true,因为虽然这两个值求值相同,但类型不同。

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

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

  • 小于 <用于表示5 < 6是真的。
  • 大于 >用于表示5 > 4是真的。
  • 小于或等于 <=用于表示5 <= 55 <= 6都是真。
  • 大于或等于 >=用于表示5 >= 55 >= 4都为真。

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

编写条件语句

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

使用if语句

当我们希望仅在满足某个条件时执行一段特定的代码时,我们使用条件语句if,然后是括号()中的条件,然后是花括号{}中要执行的代码。只有当条件求值为true时,条件语句中的代码才会执行。当条件不是true时,条件语句中的代码将被忽略,并在条件语句结束后继续处理。让我们看看代码会是什么样子:

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

字符串“Add to Cart”只会在变量$inventory包含一个大于0的数字时显示。
另外,如果条件后面只有一个表达式,PHP允许我们完全省略大括号。PHP将执行条件之后的第一个表达式,以分号结尾。这包括它们之间的空白。下面的代码的计算方式与前面的例子相同:

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

使用else语句

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

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

当购物车中的商品数量大于或等于10时,语句求值为true,并根据$subtotal计算30%的折扣。当购物车中的商品数量小于10时,语句求值为false,然后执行else代码块,这没有折扣。比较也可以写成count($cart) > 9

**注意:**在计算百分比时不能使用百分号%,因为%用于计算模,即$a除以$b的余数: 3% % 8 = 2。相反,要计算百分比,只需将百分比除以100,将其转换为小数。所以30%就是30/100,或者0.30,或者0.3

添加一个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 === 'China') {
    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变量是否被设置为China。只有当第一个条件为true时,其余的条件才会被满足。

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

这将我们带到了第二个条件的else块。与else不同,elseif区块用于在给予二次折扣之前验证购物车中的商品数量大于或等于5。我们再次检查$coupon_discount变量中的值是否大于二次批量折扣(15%)。如果第四个条件为真,$coupon_discount将用于计算$discount。否则,第四个条件为false,则我们到达最后一个15%的折扣。

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

$discount = 0;
if ($country !== 'China') {
    // 非中国店不打折
} 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允许一个空的条件块,我们可以首先检查国家并跳过任何其他条件。注意否定词!==表示该国家与值China不匹配。虽然可以让一个块完全为空,但添加注释可以解释为什么要让该块为空。

对于elseif区块,我们从最严格的开始,一直往下。在中国,如果某人的优惠券价值20% (.2),那么前3个区块将被评估为false。然后它们会到达第三个elseif,它会被评估为true,因为.2大于.15。折扣率将被计算出来,并传递最后一个条件块。

替代语法

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

$discount = 0;
if ($country !== 'China')// 非中国店不打折
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(…){。但是,如果在使用冒号定义语句时使用空格: elseif(…):,PHP将会解析失败。在实践中,最好避免空格,并始终将其写成单独的elseif

其他的比较操作符

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

使用逻辑运算符组合条件

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

  • And And表示两个条件都必须为true
  • Or Or表示有一个条件为true,或者两个条件都为true
  • Xor Xor表示只有一个条件为true
  • Not !用来否定一个条件,这会将其从true变为false
  • And &&表示两个条件都必须为true
  • Or ||表示有一个条件为true,或者两个条件都为true

andor操作符之所以有两种不同的变体,是因为它们以不同的优先级进行操作。运算符的优先级指定了它将两个表达式绑定在一起的“紧密程度”,或者运算符的求值顺序。(操作符优先级参见文档。)两种方式都是完全可以接受的,并且在大多数情况下都是一样的。PHP中的运算符是不区分大小写的,这意味着运算符也可以写成OR(或者甚至是OROR,我不建议使用这两种写法)。为了减少混乱,最重要的是无论你选择什么,都要保持一致。我将在例子中使用’ and ‘和’ or ',因为它们读起来更自然。
在折扣示例中使用:为了检查变量$country是否都被设置为China,以及购物车中的商品是否大于等于10,可以使用and操作符组合这些条件:

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

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

我们还可以组合得到相同结果的条件。如果购物车中有10件或10件以上的商品可以获得30%的折扣,或者小计金额在100元或以上也可以获得30%的折扣,可以将这些条件组合起来:

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

两个以上的条件也可以结合;然而,在使用它们时要格外谨慎。让我们试着将country评估、购物车数量和小分类比较结合起来:

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

这个例子实际上并没有按照预期的方式工作,因为首先使用cart的计数来计算国家,然后使用or对小类总数进行比较。这意味着无论country或count的值是什么,如果$subtotal大于或等于100,整个条件语句将计算为true

可以使用括号来确保条件按预期的顺序执行:

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

现在通过小计比较来评估cart计数,然后根据结果来评估国家。这提供了所需的结果,要求$country的值为China,然后购物车的计数或小计的比较(或两者)也必须计算为true

有时,比较两个值并不需要整个条件块。PHP提供了一些简写比较操作符来更精确地描述一种情况。

三元运算符

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

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

这和if/else语句是一样的:

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

可以省略三元运算符的中间部分。如果expr1求值为true,表达式expr1 ?: expr3返回expr1,否则返回expr3。要显示用户名或单词“Guest”,三元运算符如下所示:

echo $username ?: 'Guest';

如果$username设置为空字符串,这是有效的,但如果$username根本没有设置,我们会得到一个错误。在这种情况下不能使用isset函数,因为isset($username)的输出将是truefalse,而不是$username的值。这就引出了下一个操作符。

Null合并运算符

null合并运算符(??)被添加为“语法糖”(虽然很甜,但不是必需的),以满足需要与isset()一起使用三元运算符的常见情况。如果存在且不是null,则返回第一个操作数;否则返回第二个操作数。要显示用户名或单词“Guest”,可以使用null合并操作符:

echo $username ?? 'Guest';

三向比较运算符

The spaceship operator (<=>) is used for comparing two expressions: $a <=> $b. It returns -1, 0, or 1 when $a is respectively less than (<), equal to (=), or greater than (>$b
三向比较运算符(<=>)用于比较两个表达式:$a <=> $b。当$a分别小于(<)、等于(=)或大于(>)$b时,它返回-1、0或1:

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

**警告:**虽然三向比较运算符不常使用,但在编写“用户自定义排序”(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放在$item1之后,这仍然是他们开始时的顺序。
为了按价格升序排序,我们翻转了$item1$item2的位置,从而改变了比较的顺序:

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

总结

条件语句为我们提供了流控制,以确定程序的输出选择。它们是编程的基本构件之一,几乎在所有编程语言中都可以找到。
本教程涵盖了用于比较值的比较操作符和用于组合条件的逻辑操作符。它演示了ifelseelseif关键字在查看嵌套语句和组合条件时的使用。最后介绍了其他比较运算符的使用,包括三元运算符、null合并运算符和三向比较运算符。继续练习条件语句:

  • 尝试使用不同的运营商: <>=====
  • 使用andor组合运算符
  • 使用三元运算符、null合并运算符和三向比较运算符重新创建一个if语句

你可能感兴趣的:(php,php,开发语言)