PHP 运算符和流程控制
1. 算术运算符
序号 |
运算符 |
示例 |
描述 |
1 |
+ |
$a+$b |
$a与$b 的和 |
2 |
- |
$a-$b |
$a与$b 的差 |
3 |
* |
$a*$b |
$a与$b 的积 |
4 |
/ |
$a/$b |
$a与$b 的商 |
5 |
% |
$a%$b |
$a与$b 的余(模) |
6 |
++ |
$a++/++$a |
先用再加/先加再用 |
7 |
-- |
$a--/--$a |
先用再减/先减再用 |
8 |
** |
2**4 |
幂运算:2 的 4 次方 |
$a++
=>$a = $a + 1
, $a--
=>$a = $a - 1
**
: 幂运算需要 php5.6+
版本
演示代码
<?php
// 赋值
$a = 10;
$b = 15;
// % 取模 就是取余数
echo $b%$a .'<br>'; //输出 5 15/10=1 余5
// $a++ ++$a 自增
// $a++ 先用后加
echo $a++.'<br>' ; //输出 10
/*
等同于
echo $a; //先输出
$a = $a+1 ; //再加一
*/
echo $a.'<br>'; //输出 11
// ++$a 先加后用
$c = 20;
echo ++$c.'<br>'; //输出 21
/*等同于
$c = $c + 1 ; //先加1
echo $c ; //再输出
*/
2. 字符串运算符
运算符 |
示例 |
描述 |
. |
$str1 . $str2 |
连接运算,返回连接之后的字符串 |
3. 赋值运算符
序号 |
运算符 |
示例 |
描述 |
1 |
= |
$a = 10 |
将表达式的值赋给变量 |
2 |
+= |
$a += 10 |
$a = $a + 10; |
3 |
-= |
$a -= 10 |
$a = $a - 10; |
4 |
*= |
$a *= 10 |
$a = $a * 10; |
5 |
/= |
$a /= 10 |
$a = $a / 10; |
6 |
%= |
$a %= 10 |
$a = $a % 10; |
7 |
.= |
$a .= 'a' |
$a = $a . 'a'; |
代码
<?php
// 赋值
$a = 10;
$b = 15;
// +=
$a += 10;
/**等同于
* $a = $a + 10 ;
*/
echo $a ; //输出 20
// .=
$b .= 'abc';
/**等同于
* $b = $b . 'abc';
*/
echo $b ; //输出 15abc
4. 比较运算符
序号 |
运算符 |
示例 |
描述 |
1 |
> |
$a > $b |
大于 |
2 |
>= |
$a >= $b |
大于或等于 |
3 |
< |
$a < $b |
小于 |
4 |
<= |
$a <= $b |
小于或等于 |
5 |
== |
$a == $b |
等于 (值相等即可) |
6 |
=== |
$a == $b |
全等于(二边值与类型全等) |
7 |
!= |
$a != $b |
不相等 |
8 |
!== |
$a !== $b |
不全等 |
9 |
<=> |
$a <=> $b |
太空船php7+ |
- 比较运算符: 返回布尔值,常用于流程控制中(
if/while/for...
) <=>
: 也叫组合比较符, 例如$a <=> $b
, 有三种返回结果
序号 |
运算 |
结果 |
1 |
$a > $b |
返回>0 的整数 |
2 |
$a < $b |
返回<0 的整数 |
3 |
$a = $b |
返回=0 的整数 |
演示代码
<?php
// 太空船运算符
// 赋值
$a = 20;
$b = 15;
$ab = $a<=>$b;
// 判断
if ($ab == 1) :
echo 'a>b';
elseif ($ab == 0) :
echo 'a=b';
else :
echo 'a<b';
endif;
5. 逻辑运算符
序号 |
运算符 |
示例 |
描述 |
1 |
&& |
$a && $b |
逻辑与 |
2 |
` |
|
` |
`$a |
|
$b` |
逻辑或 |
3 |
! |
!$a |
逻辑非 |
4 |
xor |
$a xor $b |
逻辑异或 |
演示代码
<?php
error_reporting(E_ALL); //打开所有报错
// $name = 'a';
if( isset($name) && $name == "admin"):
echo '管理员'; //name有值且值=admin 显示管理员
elseif ( isset($name) && $name != 'admin'): // 不等于 与上面结果相同
echo '普通用户'; //name有值但值不等于admin 显示普通用户
else:echo '未登录'; //name变量为空或没有name变量 显示未登录
endif;
#当前满足第三条 运行结果 未登录
echo '<hr>';
// 逻辑运算符 ||
$wechat = '1'; //微信
$tel = '1'; //手机号
$email = '1'; //邮箱
if ( $wechat === '' || $tel === '' || $email === '' ): //如果三个变量其中有一个为空,那么输出当前账户未绑定手机/微信/邮箱
echo '当前账户未绑定手机/微信/邮箱';
else: echo '账户很安全'; //如果三个变量均不为空,那么输出账户很安全
endif;
//当前三个值都有变量 输出 账户很安全
echo '<hr>';
6. 三元运算符
序号 |
运算符 |
示例 |
描述 |
场景 |
1 |
?: |
$a ?: $b |
仅判断表达式true/false |
简化双分支 |
2 |
?? |
$a ?? $b |
判断变量存在且不为 null |
设置默认值 |
演示代码
// 三元运算符 ?:
$realname = '1';
$password = '';
$problem = '';
$r = 1;
// 用if写
// if( $realname === '' || $password === '' || $problem === ''){
// echo '当前账户存在隐患,具体原因如下:'.'<br>';
// if ($realname === '') {
// echo $r++.'.未实名'.'<br>';
// }
// if ($password === '') {
// echo $r++.'.未设置密码'.'<br>';
// }
// if ($problem === '') {
// echo $r++.'.未添加安全问题'.'<br>';
// }
// }
// 使用三元运算符简写
echo $realname === '' || $password === '' || $problem === ''?
'当前账户存在隐患,具体原因如下:'.'<br>':'';
echo $realname ==='' ? $r++.'.未实名'.'<br>' : '' ;
echo $password ==='' ? $r++.'.未设置密码'.'<br>':'';
echo $problem ===''?$r++.'.未添加安全问题'.'<br>':'';
echo '<hr>';
// 三元运算符 ??
# $username = '我爱php';
// 输出、判断有没有设置用户名,如果有显示用户名,如果没有显示默认名
// 使用 ?: 写
// echo $username = isset($username) ? $username : '木有昵称';
//输出 检测变量名是否存在且值不为null 存在直接输出 不存在输出木有昵称
// 当前该变量已被注释不存在,则输出 木有昵称
# 用三元运算符??简化上面代码
echo $username = $username ?? '木有昵称';
// 值相同,完美
7. 上面逻辑运算符、三元运算符中(?:)示例不够简洁,全部推翻重做
<?php
error_reporting(E_ALL); //打开所有报错
// 第一个例子name值为admin显示管理员,值为其他显示其他用户,没有值则显示未登录
$name = '';
if(isset($name) && $name === 'admin') :
echo '管理员'.$name; //name值等于admin 输出
elseif (isset($name) && !empty($name)):
echo '普通用户'.$name; //有name值 且不为空 输出
else : echo '未登录'; //没有name变量 或 name值为空、null false
endif;
echo '<hr>';
// 第二个例子 三个变量都存在且有值则输出账户很安全否则输出账号危险
// 还要判断值的格式是否正确
$wechat = '1'; //微信
$tel = '1'; //手机号
$email = '1@qq.com'; //邮箱
$i = 1;
// 检测WeChat是否存在值、手机号是否存在值且值的格式是否为整数、邮箱是否存在值且值的格式是否为邮箱
//都通过则显示账户安全,否则存在隐患
if (isset($wechat)&&$wechat != '' && isset($tel) && filter_var($tel,FILTER_VALIDATE_INT)&&isset($email)&& filter_var($email,FILTER_VALIDATE_EMAIL)) {
echo '账户安全';
}else {
echo '当前账户存在安全隐患,具体原因如下:'.'<br>';
}
// 检测$WeChat是否存在值,存在则不提示,不存在提示未设置
echo isset($wechat) && !empty($wechat) ? null : $i++ .'.微信账号未设置'.'<br>';
// 检测$tel是否存在值,存在则不提示,不存在提示未设置
if (!isset($tel) && empty($tel)) :
echo $i++ . '.手机号未设置'.'<br>';
// 检测$tel值类型是否正确,正确则不提示,不正确提示格式错误
elseif (isset($tel) && !filter_var($tel,FILTER_VALIDATE_INT)) :
echo $i++ . '.手机号格式错误'.'<br>';
endif;
// 检测$email是否存在值,存在则不提示,不存在提示未设置
if (!isset($email) && empty($email)) :
echo $i++ . '.邮箱未设置'.'<br>';
// 检测$email值类型是否正确,正确则不提示,不正确提示格式错误
elseif(isset($email)&& !filter_var($email,FILTER_VALIDATE_EMAIL)):
echo $i++ . '.邮箱格式错误'.'<br>';
endif;
echo '<hr>';
# 3. 若用户有昵称则原样输出,没有则显示默认昵称
$name = '我爱PHP';
echo $name = isset($name) && empty($name) ?'木有昵称':$name;
8. 错误屏蔽符
运算符 |
示例 |
描述 |
场景 |
@ |
@(10/0) |
屏蔽所有运行错误 |
线上生产环境 |
流程控制
1. 分支结构
序号 |
类型 |
语法 |
模板语法 |
1 |
单分支 |
if(){...} |
if(): ... endif; |
2 |
双分支 |
if(){...} else {...} |
if(): ... else: ... endif; |
3 |
多分支 |
if(){...} elseif {...} else {...} |
if(): ... elseif: ... else: ... endif; |
4 |
switch |
switch() {case: ... break...} |
switch(): ...endswitch; |
$problem; //创建一个‘安全’变量
$wechat = '1'; //微信
$tel = '1'; //手机号
$email = '1@qq.com'; //邮箱
$i = 1;
// 检测WeChat是否存在值、手机号是否存在值且值的格式是否为整数、邮箱是否存在值且值的格式是否为邮箱
//都通过则显示账户安全,否则存在隐患
$problem = isset($wechat)&& !empty($wechat) && isset($tel) && filter_var($tel,FILTER_VALIDATE_INT)&&isset($email)&& filter_var($email,FILTER_VALIDATE_EMAIL) ? $problem = '账户安全'.'<br>' : $problem = '当前账户存在安全隐患,具体原因如下:'.'<br>';
// 判断微信
$wechat = isset($wechat) && !empty($wechat) ? null : $i++ .'.微信账号未设置'.'<br>';
// 判断手机号
switch (true) {
case isset($tel) && empty($tel) :
$tel = $i++ . '.手机号未设置'.'<br>';
break;
case isset($tel) && !filter_var($tel,FILTER_VALIDATE_INT) :
$tel = $i++ . '.手机号格式错误'.'<br>';
break;
default:
$tel = null;
}
// 判断邮箱
switch (true) {
case isset($email) && empty($email) :
$email = $i++ . '.邮箱未设置'.'<br>';
break;
case isset($email)&& !filter_var($email,FILTER_VALIDATE_EMAIL) :
$email = $i++ . '.邮箱格式错误'.'<br>';
break;
default:
$email = null;
}
// 输出
echo $problem , $wechat ,$tel , $email ;
2. 循环结构
序号 |
类型 |
语法 |
模板语法 |
1 |
入口判断型 |
while(){...} |
while(): ... endwhile; |
2 |
出口判断型 |
do {...} while(); |
do : ... while(); |
3 |
计数型 |
for(){...} |
for () : ... endfor; |
循环控制关键字:
序号 |
关键字 |
描述 |
1 |
continue |
终止本次循环,提前进入下一轮 |
2 |
break |
跳出本层循环 |
current()
获取数组当前值
next()
指针下移
reset()
重置指针
出口判断型 无论条件是否为真,至少会执行一次
count()
可以打印出数组的数量
演示代码
$sities = ['武汉','南京','济南','合肥','上海','杭州'] ;
while ($sity = current($sities)) {
echo $sity .'<br>';
next($sities);
}
reset($sities);
echo '<hr>';
echo '<hr>';
// 利用循环写九九乘法表
for ($i=1; $i <= 9; $i++) {
for ($j=1; $j <=9 ; $j++) {
echo $j .'*'.$i .'='.$i*$j .' ; ';
if ($i === $j) break;
}
echo '<br>';
}
效果图
总结
- 太空船运算符返回三个值负数、0、正数,注意区分
- 逻辑运算符的 与、或 容易搞混,着重记一下
- 与:两边为乘法 有一个为假,则是假
- 或:两边为加法 均为假,才是假
- 错误屏蔽符,在开发环境不要用,上线必须用,把错误归到系统日志里
- 流程控制
switch
可以简化elseif ,主要是用来判断单值 - for循环 记得跳出、结束循环