条件执行
在 PHP
中,只有当条件为真时才可以执行一行代码
1 | if ($name === 'William') { |
括号内的代码称为表达式。PHP
将执行此代码并返回其布尔值(真或假)。
如果结果为 true
,则将执行 { }
之间的代码。
如果结果为 false
,则不会执行此 if
块中的任何内容
以下是另一个带有大于运算符>
的示例
1 | $amount = 120; |
此处表达式 ($amount) 将返回 true
,因此运费免费。
如果条件为 false
,则可以执行代码
1 | $amount = 120; |
此处关键字 else
表示如果表达式为 false
,则执行代码
最后,可以有多个条件
1 | $amount = 120; |
elseif
关键字用于测试另一个条件。请注意,只有当第一个条件为假时才会测试此条件。
如果第一个和第二个条件都为假,则将执行 else
部分中的代码。
比较运算符
以下是可以在表达式中使用的不同运算符。
==
相等 无类型检查===
相等 有类型检查!=
不相等||
或&&
并且>
大于<
小于
可以使用运算符 &&
同时测试多个表达式
1 | if ($amount > 0 && $amount < 50) { |
同样的原则也适用于运算符或 ||
1 | if ($amount === 100 || $amount === 200) { |
没有比较运算符的表达式
1 | $amount = 0; |
此处的表达式 ($amount) 不包含比较运算符,尽管如此,此代码仍然有效。为什么?在 PHP
中,每个表达式都转换为布尔值。因此,此处 0
转换为 false
。除零(或 null
)以外的任何其他值都将转换为 true
。
转换为布尔值
以下是将转换为 false
的值列表
false
0
0.0
null
'0'
(等于零的字符串)''
(空字符串)
所有其他值都将转换为 true
以下是转换为布尔值的一些示例
1 | $messsage = 'Hello World' |
1 | if ($value) { |
在 HTML
文件中使用 IF
语句
1 | <html lang="en"> |
每一段 PHP
代码都有开始和结束标签。这里的特殊性在于 if
和 else
代码块。这里没有 { }
。你可以用 :
代替。
Switch
如果我们有多个条件,if
、elseif
等可能会导致代码难以阅读。在这种情况下,Switch
语句有助于简化你的代码。
1 | switch ($color) { |
第一行代表我们要评估的表达式:switch($color)
然后只需包含可能的 case
。
break
函数阻止继续执行
如果没有匹配的 case
,则使用 case
默认值。
匹配
PHP 8.1
中的新功能,此指令允许你根据键 =>
值对应关系返回表达式
1 | $type = match($color) { |
第一行表示我们要匹配的表达式:match($color)
在第二行我们注意到可以一次匹配多个表达式。
然后是键 =>
值的列表。如果没有找到键 ->
值,则将执行默认键。
注意,键可以是表达式,值也可以是表达式,甚至可以是函数
1 | $type = match($color) { |
Switch 还是 Match ?Match
在视觉上更简单,但 Switch
允许为每个块执行多行代码。 Match
返回一个 Switch
不返回的值。简而言之,如果可能的话,我会使用 Match
,因为我发现该指令在视觉上更精致,但除此之外,我对 Switch
指令没有任何问题
三元运算符 ?:
这是 if...else
的简写语法。
这是一个 if...else
的示例
1 | if ($isValid) { |
这是相同的例子,但使用了三元运算符
1 | echo $isValid ? 'user valid' : 'user not valid'; |
如果运算符 ?
前面的表达式为真,则将使用 ?
后面的值,否则将使用 :
后面的值。
空合并运算符 ??
如果空合并运算符存在且不为 NULL
,则返回其第一个操作数;否则返回其第二个操作数
1 | echo $name ?? 'William'; //output 'William' if $name is null |
使用空合并运算符进行赋值 ??
1 | $name ??= 'William'; |
如果变量 $name
为空,则分配值“William”
空安全运算符
1 | echo $user?->profile?->activate(); |
如果 ?
前面的变量之一为空,则表达式的值将为空
循环
while
允许执行代码块一定次数。次数取决于条件。只要条件为真,代码块就会运行。
1 | $number = 1; |
这里代码块将被执行 9
次。
do while
本质上与 while
循环的原理相同,但在这种情况下,代码块将始终至少执行一次。仅在代码块末尾测试条件。
1 | $number = 1; |
for
用于按条件定义的次数执行代码块
1 | for ($i = 0; $i < 20; $i++) { |
该参数分为三个部分,第一部分是计数器的定义 ($i = 0)。然后是执行代码块所要遵循的条件 ($i < 20),最后是每次迭代时要执行的代码 ($i++)
foreach
foreach
函数为数组的每个元素执行一个代码块。
1 | $names = ['William', 'Shawn', 'John']; |
第一个参数是要浏览的数组的名称,第二个参数表示对当前元素的引用。
Break 和 Continue
break
和 continue
语句用于修改循环
1 | for ($i = 0; $i < 20; $i++) { |
此循环将仅当值为奇数时打印 $i
的值。
如果值为偶数 ($i % 2 === 0)
。因此我们要求循环继续执行下一个值。
可以使用 break
指令随时退出循环
1 | $i = 0; |
当 $i
的值为 10
时,循环将停止
函数
PHP
中已经预定义了几个函数。我们也可以创建自己的函数。
函数让我们避免多次重复代码。它们还让我们将应用程序划分为更易于维护的小块。
创建函数的语法非常简单
1 | function hello() { |
这里我们使用关键字 function
,后面跟着函数的名称。
一旦创建了函数,就可以启动它的执行
1 | hello(); |
我们的函数可以包含一个或多个参数
1 | function hello($firstName, $lastName) { |
函数的启动必须按照声明的顺序包含参数
1 | hello('William', 'Taylor'); |
可以为参数分配一个默认值,这样在调用函数时该参数就变成可选的了。
1 | function hello($firstName, $lastName = 'none') { |
请注意,具有默认值的参数必须最后定义。
从 PHP 8
版开始,可以通过命名参数来启动函数。调用更清晰,并且不必遵守参数的顺序。
1 | hello(lastName: 'Taylor', firstName: 'William'); |
返回
调用函数时返回一个值。
1 | function fullName($firstName, $lastName) { |
此处函数返回包含名字和姓氏的连接字符串
echo
函数将在网页上显示 fullName()
函数返回的值
匿名函数(闭包)
允许创建函数而不指定其名称。以下是示例:
1 | $sum = function ($a, $b) ( |
匿名函数以分号结尾;并且它们无法访问父上下文变量。
可以使用语句 use
从父上下文传递变量
1 | $x = 10; |
回调函数
回调函数是作为参数传递的匿名函数。以下是示例
1 | $products = ['iPhone 12', 'iPhone 13', 'iPad', 'iWatch']; |
这里 array_filter()
函数有一个匿名函数作为第二个参数。
箭头函数
允许使用快捷语法:
1 | $products = ['iPhone 12', 'iPhone 13', 'iPad', 'iWatch']; |
请注意,目前 Arrow
函数仅允许执行一个表达式。Arrow
函数在当前上下文中执行,因此它们可以使用变量而无需使用 use
语句。
函数类型提示
请注意,函数可以输入(string
、int
等)。可以为每个参数定义一个类型,并为函数的返回值定义一个类型
1 | function display(string $first, string $last) : string { |
这里的 $first
和 $last
参数必须是字符串类型,返回值也是如此。
关于类型函数,还有其他一些事情需要了解,我们稍后会回顾。
严格类型
以下是具有类型的函数的示例
1 | function add(int $a, int $b): int |
在此示例中,参数 $a
为整数类型。但是 PHP
不会返回错误。原因是 PHP
会尝试将字符串 '10'
转换为整数。如果可以转换,则不会报告任何错误。
有时你希望 PHP
不允许这种转换,并且仅在参数确实属于指定类型时才执行。为此,你必须在文件开头添加一条指令。
1 | declare(strict_types=1); |
这里返回错误,因为参数的类型不是整数
相关文章: