概述

含义

就是对数据进行某种所需要的运算的语法符号,比如加减乘除,或比较大小,或判断真假。

按参与运算的数据的个数来分类

  • 单目运算符:只需要一个数据——但必须是变量。
  • 双目运算符:需要两个数据——可以是变量,也可以直接的数据本身。
  • 三元运算符:需要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

等于(==)和全等于(===)的区别:

通常,等于(==)也会用“模糊相等”或“松散比较”的说法。

两个数据“基本相等”(类型可能会发生自动转换),就算是相等。

全等于(===)就是完全相等:

只有两个数据的数据类型一样,并且其值也一样的时候,才是全等。

查手册》》附录》类型比较表:

松散比较 *==*

TRUEFALSE10-1"1""0""-1"NULLarray()"php"""
TRUETRUEFALSETRUEFALSETRUETRUEFALSETRUEFALSEFALSETRUEFALSE
FALSEFALSETRUEFALSETRUEFALSEFALSETRUEFALSETRUETRUEFALSETRUE
1TRUEFALSETRUEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSE
0FALSETRUEFALSETRUEFALSEFALSETRUEFALSETRUEFALSETRUETRUE
-1TRUEFALSEFALSEFALSETRUEFALSEFALSETRUEFALSEFALSEFALSEFALSE
"1"TRUEFALSETRUEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSE
"0"FALSETRUEFALSETRUEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSE
"-1"TRUEFALSEFALSEFALSETRUEFALSEFALSETRUEFALSEFALSEFALSEFALSE
NULLFALSETRUEFALSETRUEFALSEFALSEFALSEFALSETRUETRUEFALSETRUE
array()FALSETRUEFALSEFALSEFALSEFALSEFALSEFALSETRUETRUEFALSEFALSE
"php"TRUEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSETRUEFALSE
""FALSETRUEFALSETRUEFALSEFALSEFALSEFALSETRUEFALSEFALSETRUE

严格比较 *===*

TRUEFALSE10-1"1""0""-1"NULLarray()"php"""
TRUETRUEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSE
FALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSE
1FALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSE
0FALSEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSE
-1FALSEFALSEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSEFALSE
"1"FALSEFALSEFALSEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSE
"0"FALSEFALSEFALSEFALSEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSE
"-1"FALSEFALSEFALSEFALSEFALSEFALSEFALSETRUEFALSEFALSEFALSEFALSE
NULLFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSETRUEFALSEFALSEFALSE
array()FALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSETRUEFALSEFALSE
"php"FALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSETRUEFALSE
""FALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSETRUE

不等于: !=

两个数据不满足“==”这个运算结果,不等于(!=)的结果就是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 = "";stringTRUEFALSETRUEFALSE
$x = null;NULLTRUETRUEFALSEFALSE
var $x;NULLTRUETRUEFALSEFALSE
$x is undefinedNULLTRUETRUEFALSEFALSE
$x = array();arrayTRUEFALSETRUEFALSE
$x = false;booleanTRUEFALSETRUEFALSE
$x = true;booleanFALSEFALSETRUETRUE
$x = 1;integerFALSEFALSETRUETRUE
$x = 42;integerFALSEFALSETRUETRUE
$x = 0;integerTRUEFALSETRUEFALSE
$x = -1;integerFALSEFALSETRUETRUE
$x = "1";stringFALSEFALSETRUETRUE
$x = "0";stringTRUEFALSETRUEFALSE
$x = "-1";stringFALSEFALSETRUETRUE
$x = "php";stringFALSEFALSETRUETRUE
$x = "true";stringFALSEFALSETRUETRUE
$x = "false";stringFALSEFALSETRUETRUE

逻辑运算的短路规则:

短路:就是对于“逻辑与” 或“逻辑或”这两种运算符,他们可能会只进行左侧的逻辑判断之后,立即就中断后续(右侧)的判断,而得出整个逻辑运算符的运算结果!

  • 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,赋值运算符通常都是最后(优先级最低)

细致的可以看手册。