作者选择了 Open Sourcing Mental Illness Ltd作为 Write for Donations计划的一部分接受捐款。
介绍
决策是生活中不可或缺的一部分. 从日常的决定穿什么,到改变工作和家庭的生活决策. 同样在发展中. 为了一个程序做任何有用的事情,它必须能够响应某种类型的输入。 当一个人点击一个网站上的联系按钮,他们预计将被带到一个联系页面. 如果没有发生什么,或者他们被带到错误的页面,用户可以选择完全停止使用该网站或公司。
用代码编写的决策是用条件来形成的:如果x,那么y
。即使是按钮的点击也是条件的一种形式:`如果按下这个按钮,去到某个特定页面。
让我们看看一些我们使用条件陈述的例子:
- 如果学生在考试中获得超过65%,请报告她的成绩通过;如果没有,请报告她的成绩失败 *如果帐户中有钱,请计算利息;如果被扣除,请收取罚款 *如果他们购买10个橙子或更多,请计算5%的折扣;如果他们购买少的话,请不要 *检查用户的位置,并根据国家显示正确的语言 *在提交时发送表单,或在缺少必要的字段旁显示警告 *在点击事件上打开折扣,或者如果已经打开了折扣
- 显示酒店的预订表单,但不是如果预订了酒店( _
在评估条件并根据这些条件是否满足而分配运行代码时,我们正在编写条件代码。
本教程将从比较运算器的概述开始,这些运算器将用于构建条件声明,接下来,它将带您通过在PHP中写条件声明,包括如果
,else
和elseif
的关键字。
比较运营商的概述
一个条件声明评估一个条件是否是真的或错误的结果,这通常是比较两个值的结果。比较运算器被用来比较两个值,正如他们的名字所暗示的那样。PHP是一个空键
(https://en.wikipedia.org/wiki/Strong_and_weak_typing)语言,这意味着,默认情况下,PHP会尝试改变数据类型以匹配预期结果,如果可能的话。这被称为类型拼搏
,并且在使用比较运算器时变得非常重要。
1false
20
30.0
4''
PHP 提供了几个比较运算符来表达值和类型/值的所需比较:
- Equal
==
in **value, after type juggling, meaning all of the values in the previous code block are equal. - Identical
===
in both type and value, meaning none of the previous values are identical, because they are all of different types. - Not Equal
!=
or>
in value, after type juggling. As opposite of equal, comparingfalse!= 0
would evaluate asfalse
because the values match. - Not Identical
!== in both **type** and **value**. Comparing
false!== 0would evaluate to
true' because although the val
美元(注)
** 注意:** 特别注意呼叫点 !
,其功能是否定其他条件。
美元
除了平等和相同之外,PHP还提供比较操作员来表达值如何相互关联。
- ** 少于 **
<
用来表示5 < 6
是真的 - ** 大于 **
> 用来表示
5 > 4` 是真的 - ** 少于或等于**
<=
用来表示5 <= 5
和5 <= 6
都是真的 - ** 大于或等于**
>= 用来表示
5 >= 5和
5 >= 4` 都是真的
现在我们知道比较运算器是什么,我们可以看看如何使用它们来写条件陈述。
写有条件的声明
比较运算符与如果
,else
和elseif
关键字相结合使用,以构建控制程序流程的条件陈述。
使用如果
声明
当我们希望只在满足条件时执行特定代码时,我们使用有条件的如果
声明,然后是(()
声明中的条件,然后是{}
声明内的执行代码。
1if ($inventory > 0) {
2 echo "Add to Cart";
3}
仅当$inventory
变量包含大于0
的数字时,才会显示Add to Cart
字符串。
换句话说,如果在条件之后只有一个表达式,PHP允许我们完全放弃弯曲的框架。PHP将执行条件之后的第一个表达式,以半色结束。
1if ($inventory > 0) echo "Add to Cart";
使用else
块
当我们想要执行一个特定代码或另一个代码时,我们将一个else
块添加到条件性如果
声明中,如果如果
块内的代码只会被执行,如果声明被评估为真
,而如果声明不是真
,则else
盒内的代码只会被执行。
1if (count($cart) >= 10) {
2 $discount = $subtotal * .3;
3} else {
4 $discount = 0;
5}
当篮子中的项目数大于或等于10时,声明将评估为真实
,并根据$subtotal
计算30%的折扣。当篮子中的项目数小于10时,声明将评估为假
,并执行else
块,不会给予折扣。
<$>[注]
**注:**在计算百分比时,您不能使用百分比符号 %
,因为 %
用于计算模块,该模块是 $a 的剩余部分分为 $b
: 3 % 8 = 2
。
添加一个else
块有时会使代码变得更混乱,值得考虑我们是否能在没有else
块的情况下实现相同的事情。
1$discount = 0;
2if (count($cart) >= 10) {
3 $discount = $subtotal * .3;
4}
我们为折扣设置了0
的默认值,并在满足条件时才更改。
写一个elseif
声明
当需要第二个条件时,您可以添加第二个条件语句:
1$discount = 0;
2if (count($cart) >= 5) {
3 $discount = $subtotal * .15
4}
5if (count($cart) >= 10) {
6 $discount = $subtotal * .3;
7}
在这样添加第二个陈述时,PHP必须检查每个陈述,即使第一个陈述已经匹配了。如果篮子里有14个项目,第一个条件陈述会评估为真
,因为14大于或等于5,从而将折扣设置为15%。之后,第二个条件陈述也会评估为真
,因为14也大于或等于10,再次设置折扣,将值推移到30%。
如果条件不按照正确的顺序,这也可能导致错误的折扣。当有可能匹配多个条件时,最好双重检查您是否在正确的顺序中评估这些条件。
代码可以通过使用elseif
块更清晰地澄清和评估:
1$discount = 0;
2if (count($cart) >= 10) {
3 $discount = $subtotal * .3;
4} elseif (count($cart) >= 5) {
5 $discount = $subtotal * .15
6}
在这种情况下,代码首先检查一个值大于或等于10。如果这个第一个陈述评估为真
,则在第一个条件块内的代码被执行,而其他条件陈述从未被评估。
条件声明可以有任何数量的elseif
条件,但只有一个else
。
无条件声明
像嵌套娃娃一样,有条件的陈述可能包含其它有条件的陈述嵌套
在它们中。当嵌套有条件的陈述时,使用一致的注释极大地有助于可读性。
1$discount = 0;
2if ($country === 'USA') {
3 if (count($cart) >= 10) {
4 if ($coupon_discount > .3) {
5 $discount = $subtotal * $coupon_discount;
6 } else {
7 $discount = $subtotal * .3;
8 }
9 } elseif (count($cart) >= 5) {
10 if ($coupon_discount > .15) {
11 $discount = $subtotal * $coupon_discount;
12 } else {
13 $discount = $subtotal * .15
14 }
15 }
16}
在本示例中,折扣仅适用于美国,因此在检查任何折扣之前,我们首先检查$country
变量设置为USA
。
接下来,我们检查篮子中的项目数是否大于或等于10个,如果第二个条件是真
,那么我们检查一个$coupon_discount
的价值是否大于10个或更多项目的正常30%折扣。
这将我们带到第二个条件的else
区块,而不是仅仅是else
区块,用elseif
区块来验证篮子中的项目数量大于或等于5个,然后再给出二级折扣的选项。我们再次检查$coupon_discount
变量中的一个值,大于二级折扣15%。如果第四个条件是真的,则使用$coupon_discount
来计算$discount
。否则,第四个条件是false
,然后我们达到最后的折扣15%。
嵌入的条件声明,如我们刚刚审查的声明,可能很难遵循,特别是如果你开始添加额外的级别,如果可能的话,考虑如何重写条件声明以删除嵌入。
1$discount = 0;
2if ($country !== 'USA') {
3 // no discount for non-us locations
4} elseif ($coupon_discount > .3) {
5 $discount = $subtotal * $coupon_discount;
6} elseif (count($cart) >= 10) {
7 $discount = $subtotal * .3;
8} elseif ($coupon_discount > .15) {
9 $discount = $subtotal * $coupon_discount;
10} elseif (count($cart) >= 5) {
11 $discount = $subtotal * .15;
12}
因为PHP允许一个空的条件块,我们可以先检查国家,然后跳过任何其他条件。小心注意负面的表达式 !==
意味着该国不匹配值 USA
。
对于elseif
区块,我们从最具限制性的区块开始,并向下工作。在美国,有价值20%的折扣(2.2)将第3个区块评估为假
然后他们将达到第三个elseif
,这将评估为真
,因为2.2大于15.折扣将被计算,最后的条件块将被传递。
替代语法
PHP确实提供了一个替代语法,可以使事情更容易阅读,当每个条件之间有很长的代码块,或者当一个循环,它也使用弯曲的语法,在一个条件内使用时。
1$discount = 0;
2if ($country !== 'USA'):
3 // no discount for non-us locations
4elseif ($coupon_discount > .3):
5 $discount = $subtotal * $coupon_discount;
6elseif (count($cart) >= 10):
7 $discount = $subtotal * .3;
8elseif ($coupon_discount > .15):
9 $discount = $subtotal * $coupon_discount;
10elseif (count($cart) >= 5):
11 $discount = $subtotal * .15;
12else:
13 $discount = $subtotal * .05;
14endif;
虽然在这些条件块内嵌入循环是可以接受的,但在这些条件块内嵌入弯曲的支架条件可能导致意想不到的结果。
<$>[注]
**注:**由于PHP处理白色空间的方式,它在使用弯曲的轴承时会接受else
和if
之间的间隙:如果(...){,否则PHP会失败,如果您在使用子时使用一个空间来定义您的陈述:
elseif(...):在实践中,最好避免间隙,并始终将此写成单个
elseif`
<>$
其他比较运营商
在每个条件语句中使用单个比较运算符并不是使用比较运算符的唯一方法,我们不仅可以组合条件,还可以使用条件语句以外的比较运算符。
使用逻辑操作员组合条件
当有多个条件都必须是真实的,或多个条件会产生相同的影响时,可以使用逻辑运算器将条件陈述合并为一个单个块。
或表示任何一个条件都是真
或两者都可以是真
。(
)Xor*xor
表示只有其中一个条件是真
。
- Not!
被用来否定一个条件,这使它从评估
真变成评估
假*和**
&&&表示两个条件都必须是
真`。
两个不同的变异的 and和 or操作员的原因是,它们在不同的先决条件下运作。一个操作员的先决条件规定了它如何紧密
连接两个表达式在一起,或者以何种顺序进行操作的评估(参见操作员先决条件的文档。)这两种方式是完全可以接受的,并且在大多数情况下都是一样的。PHP中的操作员不敏感,这意味着操作员也可以被写成OR
(或甚至Or
或oR
),这两者都不是我推荐的)。
使用折扣示例: 若要检查$country
变量都设置为USA
,并且篮子中的项目大于或等于 10,则可以使用和
运算符来组合这些条件:
1$discount = 0;
2if ($country === 'USA' and count($cart) >= 10) {
3 $discount = $subtotal * .3;
4}
该示例有两个条件:$country ===USA
和count($cart) >=10
。如果这两个条件评估为true
,则该块内的代码将被执行。
如果在篮子里有10个或更多项目产生30%的折扣,或者有100美元或更多的子总数也会产生30%的折扣,这些条件可以结合起来:
1$discount = 0;
2if (count($cart) >= 10 or $subtotal >= 100) {
3 $discount = $subtotal * .3;
4}
还可以结合两个以上的条件;但是,在使用它们时要特别小心。
1# BAD
2$discount = 0;
3if ($country === 'USA' and count($cart) >= 10 or $subtotal >= 100) {
4 $discount = $subtotal * .3;
5}
此示例实际上并不以预期的方式工作,因为该国首先用篮子的计数进行评估,然后将该结果与使用或
的子总比较进行评估,这意味着无论该国或计数值是什么,如果$子总数
大于或等于100
,则完整的条件声明将评估为真
。
可以使用对接,以确保条件按照预期的顺序进行评估:
1$discount = 0;
2if ($country === 'USA' and (count($cart) >= 10 or $subtotal >= 100)) {
3 $discount = $subtotal * .3;
4}
这提供了要求$country
具有USA
的值的所需结果,然后要么对篮子的计数,要么对次数的比较(或两者)也必须评估为true
。
有时不需要一个完整的条件块来比较两个值,PHP提供了几个简短比较操作器来更准确地描述一个情况。
终极操作员
如果一个表达式是真实的,并且如果同一个表达式是假的,可以使用一个 _ternary 运算符。 表达式 (expr1)? (expr2) : (expr3)' 会评估为
expr2' 如果 expr1' 评估为
true', 以及 expr3' 如果
expr1' 评估为 false。 假设访问者的用户名应该显示为
如果他们已登录,而如果没有,则应该显示为 `Guest' 这个词。
1echo (isset($username)) ? 'Guest' : $username;
这与这个如果/else
陈述相同:
1if (isset($username)) {
2 echo 'Guest';
3} else {
4 echo $username;
5}
可以排除三位数操作员的中间部分。 表达式 expr1?: expr3
返回 expr1
如果 expr1
评价为 true,而 expr3
否则。
1echo $username ?: 'Guest';
如果$username
设置为空字符串,但如果$username
没有设置,则会出现错误。在这种情况下,不能使用isset
函数,因为isset($username)
的输出将是true
或false
,而不是$username
的值。
零合并操作员
null coalescing 运算符 (??
) 已被添加为合成糖
(可爱但不需要) 对于需要与 isset() 结合使用 ternary 的常见情况. 它返回其第一个运算符如果它存在并且不是 null;否则它返回其第二个运算符. 要显示用户名或
客人`字,则使用 null 运算符:
1echo $username ?? 'Guest';
航天员
航天器操作符(<=>
)用于比较两个表达式: $a <=> $b
. 它返回 -1,0 或 1 当 $a
分别小于 (<
),等于 (=
),或大于 (>
) $b
:
1echo 1 <=> 1; // 0
2echo 1 <=> 2; // -1
3echo 2 <=> 1; // 1
<$>[警告]
**警告:**虽然航天器操作员不经常使用,但在写一个用户定义类
(usort
) 函数时,它非常有用。
让我们创建一系列新产品. 该系列中的每个产品,反过来,将是其自己的嵌入式产品属性:
1$products = [
2 ['name'=>'Flippers', 'price'=>7.99],
3 ['name'=>'Wet Suit', 'price'=>18.99),
4 ['name'=>'Snorkel', 'price'=>2.99),
5 ['name'=>'Mask', 'price'=>6.99),
6];
现在让我们假设我们希望按照每个项目的价格来排序这个$products
数组,以下降顺序进行排序。我们可以通过使用usort
函数来做到这一点,然后将一个匿名函数传输到其中,该函数处理排序逻辑。
1usort($products, function($item1, $item2) {
2 return $item2["price"] <=> $item1["price"];
3});
usort
函数采用两个参数(值传递到函数)。第一个参数是$products
数组。第二个函数是anonymous
函数,该函数告诉usort
函数在数组中的每个项目要做什么。如果$item2
的价格小于$item1
的价格,则操作员会返回-1
,将$item2
移动到$item1
之前。如果价格相同,则操作员会返回0
,这将使项目保持相同的顺序。最后,如果$item2
的价格大于$item1
的价格,则操作员会返回1
,将$item2
放置到$item1
之后,这也是他们开始的顺序。
要按价格按上升顺序排序,我们将$item1
和$item2
的位置扭转,这改变了比较的顺序:
1usort($products, function($item1, $item2) {
2 return $item1["price"] <=> $item2["price"];
3});
结论
条件声明为我们提供流量控制,以确定我们的程序的输出选择,它们是编程的基本构建要素之一,几乎可以找到所有编程语言。
本教程涵盖了比较运算器用于比较值和合并条件的逻辑运算器。它展示了使用如果
,else
和elseif
关键字,同时查看嵌入式陈述和合并条件。
- 尝试使用不同的运算符:
<
,>
,==
,===
- 将运算符与
and
或or
- 重创使用 ternary、 null coalescing 或航天器运算符
的
if
语句
有关如何在PHP中编码的更多信息,请参阅 如何在PHP中编码系列的其他教程。