0. 流程控制
任何 PHP 脚本都是由一系列语句构成的。
一条语句可以是一个赋值语句,一个函数调用,一个循环,一个条件语句或者甚至是一个什么也不做的语句(空语句)。
语句通常以分号结束。
此外,还可以用花括号将一组语句封装成一个语句组。
语句组本身可以当作是一行语句。
1. 运算符
运算符是可以通过给出的一或多个值(用编程行话来说,表达式)来产生另一个值(因而整个结构成为一个表达式)的东西。
运算符可按照其能接受几个值来分组。
一元运算符只能接受一个值,例如 !(逻辑取反运算符)或 ++(递增运算符)。
二元运算符可接受两个值,例如熟悉的算术运算符 +(加)和 -(减),大多数 PHP 运算符都是这种。
最后是唯一的三元运算符 ? : ,可接受三个值;通常就简单称之为“三元运算符”(尽管称之为条件运算符可能更合适)。
2. 算术运算符
例子 | 名称 | 结果 |
---|---|---|
+$a | 标识 | 根据情况将 $a 转化为 int 或 float。 |
-$a | 取反 | $a 的负值。 |
$a + $b | 加法 | $a 和 $b 的和。 |
$a - $b | 减法 | $a 和 $b 的差。 |
$a * $b | 乘法 | $a 和 $b 的积。 |
$a / $b | 除法 | $a 除以 $b 的商。 |
$a % $b | 取模 | $a 除以 $b 的余数。 |
$a ** $b | 求幂 | $a 的 $b次方的值。 |
除法运算符总是返回浮点数。
只有在下列情况例外:两个操作数都是整数(或字符串转换成的整数)并且正好能整除,这时它返回一个整数。 整数除法可参考 intdiv()。
取模运算符的操作数在运算之前都会转换成 int 。 浮点数取模可参考 fmod()。
取模运算符 %
的结果和被除数的符号(正负号)相同。即 $a % $b
的结果和 $a 的符号相同
3.关系比较运算符
例子 | 名称 | 结果 |
---|---|---|
$a == $b | 等于 | **true** ,如果类型转换后 $a 等于 $b。 |
$a === $b | 全等 | **true** ,如果 $a 等于 $b,并且它们的类型也相同。 |
$a != $b | 不等 | **true** ,如果类型转换后 $a 不等于 $b。 |
$a <> $b | 不等 | **true** ,如果类型转换后 $a 不等于 $b。 |
$a !== $b | 不全等 | **true** ,如果 $a 不等于 $b,或者它们的类型不同。 |
$a < $b | 小与 | **true** ,如果 $a 严格小于 $b。 |
$a > $b | 大于 | **true** ,如果 $a 严格大于 $b。 |
$a <= $b | 小于等于 | **true** ,如果 $a 小于或者等于 $b。 |
$a >= $b | 大于等于 | **true** ,如果 $a 大于或者等于 $b。 |
$a <=> $b | 太空船运算符(组合比较符) | 当$a小于、等于、大于 $b时 分别返回一个小于、等于、大于0的 int 值。 |
注意:
==
和 !=
只比较值,不比较类型, 比如: 1 == "1"
结果为true
===
和 !==
即比较值,也比较类型, 1=== "1"
结果为false
4. 逻辑运算符
例子 | 名称 | |
---|---|---|
! $a | Not(逻辑非) | **true** ,如果 $a 不为 **true** 。 |
$a && $b | And(逻辑与) | **true** ,如果 $a 和 $b 都为 **true** 。 |
$a || $b | Or(逻辑或) | **true** ,如果 $a 或 $b 任一为 **true** 。 |
逻辑运算符具有短路特性:
&& 逻辑与短路: 当多个表达式逻辑与时,如果第一个表达式为假,那该表达式后的表达式短路处理
|| 逻辑或短路: 当多个表达式逻辑或时,如果第一个表达式为真,那该表达式后的表达式短路处理
5. 字符串连接运算符
运算符 | 说明 | 示例 |
---|---|---|
. | 连接运算符 | b,将b连接成一个全新的字符串 |
如果连接字符串时,第一个运算数不是字符串,那么 连接符两边都要有空格,否则会报错
echo "a" . 1;
echo "<br>";
echo 1 . "a";
echo "<br>";
// 报错
// echo 1. "a";
6. 赋值/复合赋值运算符
运算符 | 说明 | 示例 |
---|---|---|
= | 赋值 | a变量 |
+= | 加 | a = $a + 3 |
-= | 减 | a = $a – 3 |
*= | 乘 | a = $a * 3 |
/= | 除 | a = $a / 3 |
%= | 求模 | a = $a % 3 |
.= | 连接 | $a .= a = $a . $b |
注意: 复合赋值运算符是一种简写形式,但是是一种独立的运算符,功能相当于展开形式,但实际计算并不展开.优先级比同功能运算符低.
7. 递增递减运算符
例子 | 名称 | 效果 |
---|---|---|
++$a | 前加 | $a 的值加一,然后返回 $a。 |
$a++ | 后加 | 返回 $a,然后将 $a 的值加一。 |
—$a | 前减 | $a 的值减一, 然后返回 $a。 |
$a— | 后减 | 返回 $a,然后将 $a 的值减一。 |
$a++ / $a— : 先用 a 值 , 后进行运算
++a : 先进行运算,后使用计算后的 a 值
i++ , 先用后加
++i, 先加后用
8. 条件运算符
表达式1 ? 表达式2 : 表达式3
如果 “表达式1” 成立,则执行 “表达式2” ,否则执行 “表达式3”。
// 因为是运算符,所以是 cpu 直接加载运算的, 执行效率快. 简单的判断应用较多
// if 结构,是语言中的一种结构语法,由解释器执行,速度慢,, if 更直观,适用复杂结构的条件
9. 错误抵制符
@表达式
错误抑制符“@”,用于忽略表达式的错误信息。
10. 运算符优先级
常用运算符优先级
| 优先级由高到低 | 运算符 | | —- | —- | | 1 | ++、—、@ | | 2 | ! | | 3 | 、/、%, ** | | 4 | +、- | | 5 | <、<=、>、>= | | 6 | 、!=、
=、!== | | 7 | &&、|| | | 8 | ??、?: | | 9 | =、+=、-=、=、/=、%=、.= |完整运算符优先级
| 结合方向 | 运算符 | 附加信息 | | —- | —- | —- | | 不适用 |clone
new
| clone
和 new | | 右 |**
| 算术运算符 | | 不适用 |+
-
++
--
~
(int)
(float)
(string)
(array)
(object)
(bool)
@
| 算术
(一元+
和-
), 递增/递减
, 按位
, 类型转换
和 错误控制 | | 左 |instanceof
| 类型 | | 不适用 |!
| 逻辑运算符 | | 左 |*
/
%
| 算术运算符 | | 左 |+
-
.
| 算数
(二元+
和-
), array
和 string
(.
PHP 8.0.0 前可用) | | 左 |<<
>>
| 位运算符 | | 左 |.
| string
(PHP 8.0.0 起可用) | | 无 |<
<=
>
>=
| 比较运算符 | | 无 |==
!=
===
!==
<>
<=>
| 比较运算符 | | 左 |&
| 位运算符
和 引用 | | 左 |^
| 位运算符 | | 左 ||
| 位运算符 | | 左 |&&
| 逻辑运算符 | | 左 |||
| 逻辑运算符 | | 右 |??
| null 合并运算符 | | 无关联 |? :
| 三元运算符
(PHP 8.0.0 之前左联) | | 右 |=
+=
-=
*=
**=
/=
.=
%=
&=
|=
^=
<<=
>>=
??=
| 赋值运算符 | | 不适用 |yield from
| yield from | | 不适用 |yield
| yield | | 不适用 |print
| print | | 左 |and
| 逻辑运算符 | | 左 |xor
| 逻辑运算符 | | 左 |or
| 逻辑运算符 |
11. isset() 函数
isset(mixed $var, mixed $... = ?): bool
检测变量是否已设置并且非 **null**
12. empty() 函数
empty(mixed $var): bool
检查一个变量是否为空
判断一个变量是否被认为是空的。当一个变量并不存在,或者它的值等同于**false**
,那么它会被认为不存在。如果变量不存在的话,empty()并不会产生警告。
13. 分支语句— if
对于 分支语句 ,我们并不陌生,几乎每门语言中都会存在,只是在语法书写上有些区别,但是实际功能差别不大.
if 会先进行表达式布尔求值。如果 表达式 的值为 **true**
,PHP 将执行 statement1,如果值为 **false**
——将忽略 statement2
格式一
<?php
if (expr){
statement
}
?>
格式二
<?php
if (expr){
statement 1
}else{
statement 2
}
?>
格式三
<?php
if (expr1){
statement 1
}else if (expr 2){
statement 2
}else if (expr3){
statement 3
}
...
else {
statement N
}
?>
练习
- 表单提交用户名和密码,判断是否为用户 tom, 密码是否为123,如果是显示登陆成功,否则显示用户名密码错误
- 改进上面的练习, 先判断用户名是否正确,给出用户提示,如果用户名正确,再判断密码是否正确,密码正确提示登陆成功,否则提示密码不正确.
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form action="test.php" method="get">
<p>姓名: <input type="text" name="username" id="n"></p>
<p>密码: <input type="password" name="passwd" id="p"></p>
<p><input type="submit" value="提交"></p>
</form>
</body>
</html>
test.php
// 练习一
<?php
// 向客户端发送响应头信息
header("Content-Type:text/html;charset=utf-8");
// 获取客户端提交的查询参数数据
$username = $_REQUEST["username"];
$passwd = $_REQUEST["passwd"];
// 判断用户名和密码
if($username === "tom" && $passwd === "123"){
echo "登陆成功";
}else{
echo "用户名密码错误";
}
?>
test.php
// 练习二
<?php
// 向客户端发送响应头信息
header("Content-Type:text/html;charset=utf-8");
// 获取客户端提交的查询参数数据
$username = $_REQUEST["username"];
$passwd = $_REQUEST["passwd"];
// 判断用户名和密码
if($username === "tom"){
if($passwd === "123"){
echo "登陆成功";
}else{
echo "密码不正确";
}
}else{
echo "用户名不存在";
}
?>
14. 分支语句— switch-case
switch(表达式){
case 结果1:
相关代码1;
break;
case 结果2:
相关代码2;
break;
……
case 结果n:
相关代码n;
break;
default:
默认代码;
}
如果 “表达式” 的值等于 “结果1” ,则执行 “相关代码1”;
否则如果 “表达式” 的值等于 “结果2” ,则执行 ”相关代码2” ,往后以此类推。
另外,如果 ”表达式” 的值与所有 case 的值都不能匹配,则执行 default 的 “默认代码” 。