概述
含义
就是对数据进行某种所需要的运算的语法符号,比如加减乘除,或比较大小,或判断真假。
按参与运算的数据的个数来分类
- 单目运算符:只需要一个数据——但必须是变量。
- 双目运算符:需要两个数据——可以是变量,也可以直接的数据本身。
- 三元运算符:需要3个数据才能运算,也称为三目运算符。只有一个三元运算符。
按功能分类
- 赋值运算符:=
- 算术运算符:+ - * / %
- 连接运算符:.
- 自赋值运算符:+= -= *= /= %= .=
- 自操作运算符:++ --
- 比较运算符:> >= < <= == != === !==
- 逻辑运算符:&&(与) ||(或) !(非)
- 条件运算符:数据1 ? 数据2 : 数据3
- 位运算符:& | ~
- 其他:@,是错误抑制符;( ),括号,用于提升运算优先级,括号中的先运算。
赋值运算符
只要理解一个核心的观念:
就是将等号(=)右边的数据(可能是运算结果数据)赋值给左边的变量。
看看一下写法:
$v1 = 1;
$v2 = 2;
$v3 = $v1 + $v2;
$v1 + $v2 = $v3; //可以吗?不可以!
if( $v1 + $v2 = $v3 ){....} //可以吗???还是不可以!
一定记住,一个等号的左边,只能是一个“变量名”!
所以,这个写法是错误的: $v1+2 = $v2 + 3
算术运算符
针对数字进行的算术计算,包括:+ - * / %
%:对整数数字进行“取余操作”——如果不是整数,会先自动转换为整数之后再进行取余。
转换为整数的做法是:直接去掉小数部分
比如:
$v1 = 10 % 3; // 结果为1
$v2 = 10.8 % 3.6 // 结果为1
如果不是数字,会自动转换为数字进行。
举例:
<?php
echo (3 + "4"); //
echo ("3" + "4"); //
echo ("3" + "4.5"); //
echo (3 + "4abcd"); //
echo ("3ab" + "4cd"); //
echo (3 + "abc4"); //
echo ("ab3" + "cd4"); //
echo ("ab" + "cd"); //
echo (3 + true); //
echo (3 + false); //
?>
连接运算符( . )
就是字符串的连接,能够将前后字符连接起来。
如果不是字符串,会自动转换为字符串。
<?php
echo "ab" . "cd";
echo $v1 . "ef";
echo "ab" . 12; //"ab12"
echo 12 . 34; //"1234"
echo "12" . true; //"121",true转为字符串,为"1";
echo "12" . false; //"12",false转为字符串,为""(即空字符串);
?>
自赋值运算符
针对数字的,包括: += -= *= /= %=
针对字符串的,只有一个:.=
形式:$变量 += 数据;
相当于这个赋值语句: $变量 = $变量 + 数据;
此时,其实是相当于该变量的值,跟给定的数据进行运算后的结果数据,再放回到该变量中(覆盖了之前的数据)。
自操作(自加自减)运算符
针对整数,只有2个:++ --
属于单目运算符,即只要一个变量就可以进行运算。
形式:
- $变量++; //对该变量中数据+1
- $变量--; //对该变量中数据-1
- ++$变量; //对该变量中数据+1
- --$变量; //对该变量中数据-1
++讨论:表示对该变量进行“自加1”操作。即该变量中的数据加1。
- 前自加:
- 后自加:
举例:常见自加与赋值的混合运算:
<?php
$n1 = 10;
$n2 = 10;
$n1++; //自加
++$n2; //自加
echo "<br>n1加加后:" . $n1;
echo "<br>n2加加后:" . $n2;
//结论:"++"运算,都是对相应的变量加1
//不管是放在前面(前++),还是后面(后++)
echo "<hr>";
echo "<hr>";
echo "<hr>";
echo "<hr>";
$m1 = 10;
$s1 = $m1++;//这是后自加:先取值,再自加,再去进行其他运算
$s2 = ++$m2;//这是前自加:先自加,后取值,再去进行其他运算
echo "<br>此时,m1为:$m1", ",s1为:$s1";
echo "<br>此时,m2为:$m2", ",s2为:$s2";
echo "<br>m1:", $m1++ + 5;
echo "<br>m2:", ++$m2 + 5;
echo "<hr>";
echo "<br>m1:$m1";
echo "<br>m2:$m2";
?>
总结:
1,前自加,后自加,对变量本身的结果都是加1,没有区别。
2,但前自加、后自加如果跟别的运算符一起进行,此时区别为:
前自加:先发生自加,后做别的运算;
后自加:先发生别的运算,后自加。
比较运算符
含义:是针对数字的大小进行比较的运算。如果不是数字,会自动转换为数字。
包括: > >= < <= == != === !==
所有比较运算符,运算的结果只有两个可能(之一): true 或 false
比如:if( 1 == 2); //结果是false
等于(==)和全等于(===)的区别:
通常,等于(==)也会用“模糊相等”或“松散比较”的说法。
两个数据“基本相等”(类型可能会发生自动转换),就算是相等。
全等于(===)就是完全相等:
只有两个数据的数据类型一样,并且其值也一样的时候,才是全等。
查手册》》附录》类型比较表:
松散比较 *==*
TRUE | FALSE | 1 | 0 | -1 | "1" | "0" | "-1" | NULL | array() | "php" | "" | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
TRUE | TRUE | FALSE | TRUE | FALSE | TRUE | TRUE | FALSE | TRUE | FALSE | FALSE | TRUE | FALSE |
FALSE | FALSE | TRUE | FALSE | TRUE | FALSE | FALSE | TRUE | FALSE | TRUE | TRUE | FALSE | TRUE |
1 | TRUE | FALSE | TRUE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
0 | FALSE | TRUE | FALSE | TRUE | FALSE | FALSE | TRUE | FALSE | TRUE | FALSE | TRUE | TRUE |
-1 | TRUE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE |
"1" | TRUE | FALSE | TRUE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
"0" | FALSE | TRUE | FALSE | TRUE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE |
"-1" | TRUE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE |
NULL | FALSE | TRUE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | TRUE | TRUE | FALSE | TRUE |
array() | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE | TRUE | FALSE | FALSE |
"php" | TRUE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE |
"" | FALSE | TRUE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | TRUE |
严格比较 *===*
TRUE | FALSE | 1 | 0 | -1 | "1" | "0" | "-1" | NULL | array() | "php" | "" | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
TRUE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
1 | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
0 | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
-1 | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
"1" | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
"0" | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE |
"-1" | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE |
NULL | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE |
array() | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE |
"php" | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE |
"" | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE |
不等于: !=
两个数据不满足“==”这个运算结果,不等于(!=)的结果就是true,比如:
if( 1 != 2 ) //true
不全等于:!==
两个数据不满足“===”这个运算结果,不全等于(!==)的结果就是true,比如:
if( “1” !== 1 ) //true
逻辑运算符
针对“布尔值”进行的运算,只有3个:
- 与: &&
- 或: ||
- 非: !
如果不是布尔值,会自动转换为布尔值去进行运算。
因为布尔值只有2个,不管怎么排列组合,最终只有以下10种情况的计算,几乎就是公式化。
逻辑与(&&):
含义:
表示两个条件(数据)的真假结果是否同时为真的共同作用结果。
运算结果:只有两个条件都为真的时候,结果才是真(true)。
只有如下4种情况:
- true && true 结果为 true
- true && false 结果为 false
- false && true 结果为 false
- false &&false 结果为 false
总结归纳出逻辑与(&&)的真值表(就是公式,类似99乘法表):
$v1, $v2表示任意变量(条件) | $v1 = true时 | $v1 = false时 |
---|---|---|
$v2 = true时 | $v1 && $v2 :true | $v1 && $v2 :false |
$v2 = false时 | $v1 && $v2 :false | $v1 && $v2 :false |
可见:逻辑与运算的结果,只有两个是真,才是真。
实际应用中,往往是以“条件”的面目出现,而不是简单的真假值,比如:
$v1 = 18; //请判断该数是否能被3整除并且还能被5整除!
if( $v1 % 3 == 0 && $v1 % 5 == 0 ){....}
逻辑或(||):
含义:
表示两个条件(数据)的真假结果的是否存在“真”的情况的共同作用结果。
运算规则:
只要有任意一个条件为真(true),结果就是真。
只有如下4种情况:
- true || true 结果为 true
- true || false 结果为true
- false || true 结果为 true
- false ||false 结果为 false
总结归纳出逻辑或(||)的真值表(就是公式,类似99乘法表):
$v1, $v2表示任意变量(条件) | $v1 = true时 | $v1 = false时 | ||||
---|---|---|---|---|---|---|
$v2 = true时 | $v1 \ | \ | $v2 :true | $v1 \ | \ | $v2 :true |
$v2 = false时 | $v1 \ | \ | $v2 :true | $v1 \ | \ | $v2 :false |
可见:逻辑或运算的结果,只要有一个是真,就是真。
实际应用中,往往也是以“条件”的面目出现,而不是简单的真假值,比如:
$v1 = 18; //请判断该数是否能被3整除或能被5整除!
if( $v1 % 3 == 0 || $v1 % 5 == 0 ){....}
案例:判断某年是否为闰年(可使用表单输入的形式)
<?php
if (isset($_POST['year'])) {
if (!empty($_POST['year'])){
if (is_numeric($_POST['year'])){
if ($_POST['year']>0) {
if ($_POST['year'] == (int)$_POST['year']) {
if ($_POST['year'] % 4 ==0 && $_POST['year'] %100 != 0 || $_POST['year'] %400 ==0) {
echo 'success';
} else {
echo 'Not a 闰年';
}
} else {
echo '应输入整数';
}
} else {
echo '年份应大于0';
}
} else {
echo 'Not a number!';
}
} else {
echo 'error';
}
} else {
echo '初次打开页面,未检测到出入数据';
}
?>
逻辑非(!):
就是对一个布尔值进行“取反”操作,规则为:
!true 结果为false
!false 结果为true
逻辑非(!)在if中的常见应用情形:
if( !isset( $v1 ) ){....} //如果$v1为空(null)
if( !empty( $v1 ) ){...} //如果$v1不为空(empty)
对应的两个相反的情形是:
if( isset( $v1 ) ){....} //如果$v1存在
if( empty( $v1 ) ){...} //如果$v1为空(empty)
区分两个“空”:
null: “真空”,什么都没有,是明确定义的“没有数据”的一种写法(含义)
empty:“现实意义上的没有”,就是无,就是0,等等,常见的,认为是empty的数据有:
“”(空字符串), 0, 0.0, “0”, false, null, 空数组,
还是查手册》附录》类型比较表:使用 PHP 函数对变量 $x 进行比较
表达式 | gettype() | empty() | is_null() | isset() | boolean : if($x) |
---|---|---|---|---|---|
$x = ""; | string | TRUE | FALSE | TRUE | FALSE |
$x = null; | NULL | TRUE | TRUE | FALSE | FALSE |
var $x; | NULL | TRUE | TRUE | FALSE | FALSE |
$x is undefined | NULL | TRUE | TRUE | FALSE | FALSE |
$x = array(); | array | TRUE | FALSE | TRUE | FALSE |
$x = false; | boolean | TRUE | FALSE | TRUE | FALSE |
$x = true; | boolean | FALSE | FALSE | TRUE | TRUE |
$x = 1; | integer | FALSE | FALSE | TRUE | TRUE |
$x = 42; | integer | FALSE | FALSE | TRUE | TRUE |
$x = 0; | integer | TRUE | FALSE | TRUE | FALSE |
$x = -1; | integer | FALSE | FALSE | TRUE | TRUE |
$x = "1"; | string | FALSE | FALSE | TRUE | TRUE |
$x = "0"; | string | TRUE | FALSE | TRUE | FALSE |
$x = "-1"; | string | FALSE | FALSE | TRUE | TRUE |
$x = "php"; | string | FALSE | FALSE | TRUE | TRUE |
$x = "true"; | string | FALSE | FALSE | TRUE | TRUE |
$x = "false"; | string | FALSE | FALSE | TRUE | TRUE |
逻辑运算的短路规则:
短路:就是对于“逻辑与” 或“逻辑或”这两种运算符,他们可能会只进行左侧的逻辑判断之后,立即就中断后续(右侧)的判断,而得出整个逻辑运算符的运算结果!
- if ( 左侧判断 && 右侧判断 )
- if ( 左侧判断 || 右侧判断 )
举例:判断一个整数(比如13)是否能被3整除并且能被5整除!
结论:
我们应该将我们可能发生短路运算的逻辑判断的前后判断语句,做如下调整:
相对简单的运算放前面(左侧),相对复杂的运算放后面(右侧)。
对于逻辑或的短路运算,道理一样。
短路运算:
<?php
$num1 = 1;
$num2 = 3;
if ($num2 >4 && $num2 > $num1++) {
echo 'success';
} else {
echo 'error';
echo "<Br>$num1";
}
if ($num2 >2 || $num2 > $num1++) {
echo '<Br>success';
echo "<Br>$num1";
} else {
echo 'error';
}
if ($num2 >3 || $num2 > $num1++) {
echo '<Br>success';
echo "<Br>$num1";
} else {
echo 'error';
}
?>
小案例:
<?php
// 假设给定一个整数表示一个员工的年龄,
// 如果该年龄为整十的数,
// 或者年龄的平方除以100在10~20之间,
// 则公司在当年年底会给该员工发特别奖。
// 请写出程序来判断某个年龄的员工是否可以得奖。
$age = 20; //当age为20,30,就会发生短路
if($age % 10 == 0 || $age*$age/100>=10 && $age*$age/100<= 20)
{
echo "<br>可以得奖";
}
else
{
echo "<br>不可以得奖";
}
echo "<br>再来一个写法:";
//这个,对于32也会短路
if($age*$age/100>=10 && $age*$age/100<= 20 || $age % 10 == 0)
{
echo "<br>可以得奖";
}
else
{
echo "<br>不可以得奖";
}
?>
条件运算符
只有一个条件运算符,形式为:表达式1 ? 表达式2 :表达式3
含义:
如果表达式1为true(或自动转换后为true),则运算的结果值为表达式2,否则为表达式3。
举例:
$score = 77; //分数
$v1 = $score >= 60 ? “及格” : “不及格”;
其本质是:
$score = 77; //分数
if ( $score >= 60 ){
$v1 = “及格”;
}
else{
$v1 = “不及格”;
}
位运算符(了解)
针对整数进行的二进制级别的运算。基本位运算符包括:按位与( & ), 按位或( | ), 按位非( ~ ),
按位异或(^)
位运算基本运算规则:
位运算符有如下基本运算规则:
(只针对二进制的0和1这两个数据的基本位运算规则):
按位与(&)运算规则:
0 & 1 结果为:0
0 & 0 结果为:0
1 & 0 结果为:0
1 & 1 结果为:1
结论:只有两个都是1,按位与运算结果才是1
按位或(|)运算规则:
0 | 1 结果为:1
0 | 0 结果为:0
1 | 0 结果为:1
1 | 1 结果为:1
结论:只有两个都是0,按位或运算结果才是0
按位非(~):
~1结果为0
~0结果为1
按位异或(^):
0 ^ 1 结果为:1
0 ^ 0 结果为:0
1 ^ 0 结果为:1
1 ^ 1 结果为:0
规则是:相同为0,不同为1
整数的按位与(&)运算
含义:
是针对整数的二进制值进行的位运算结果。
$v1 = 6 & 8; //这里,虽然是普通整数,但其内部是按该整数的二进制形式进行位运算
运算规则:
将6和8的二进制数字的每一个对应位上的数字(0或1)进行基本的按位与(&)的运算所得到的结果。
数字6的二进制 | 数字8的二进制 | 按位与结果 |
---|---|---|
结果:
再来一个:
$v2 = 7 & 9;
数字7的二进制 | ||||||||
---|---|---|---|---|---|---|---|---|
数字9的二进制 | ||||||||
按位与结果 |
结果。
还有整数的其他位运算:
按位或,按位左移,按位右移。
按位左移运算
$v1 = 8 << 2; //8是要进行左移运算的整数,2是表示要进行移动的位数。
含义:
将8这个数的二进制形式的数字的所有位都往左边移动2位,最右边空出部分填0(补0),最左边部分就会有2位“冒出去”了,也不要处理(不管),这样移动后,所得到的二进制数就是结果。
分析如下:
8的二进制 | ||||||||
---|---|---|---|---|---|---|---|---|
左移两位后: |
结果:
再来一个:
11的二进制 | ||||||||
---|---|---|---|---|---|---|---|---|
左移两位后: |
结果:
总结:
将一个整数左移n位,就是相当于将该数乘以2的n次方。
错误抑制符@
含义:
在一个表达式出现错误的时候,可以将错误“隐藏”(掩盖)起来(不输出)!
通常,该符号,用于在实际运行环境中的一些条件非我们(程序员)所能控制的情形。
如果出现该情形并报错,则我们可以抑制该错误的显示(只是该错误不显示,不是没有错误了)。
典型应用场景:
if( @mysqli_connect(‘localhost’, ‘root’, ‘123’ ) ){
.......
}
加上抑制符后:
运算符的优先级
运算符优先级不得不说的规则:
1,时刻意识到,运算符有优先级问题!
2,小括号可以改变运算的顺序(即括号最优先)
3,先乘除(以及取余)后加减;
4,大致有如此优先级规则:算术运算 > 比较运算 > 逻辑运算
5,赋值运算符通常都是最后(优先级最低)
细致的可以看手册。