第3天 PHP数据类型及运算

4. 数据类型

4.1. 数据类型分类与概述

4.1.1. 标量类型:

标量类型也可以理解为“基本类型”,“简单类型”。
标量类型包括如下4种:
字符串类型:String
就是一串字符串,当做一个整体,表示一个连续有确定顺序的字符串。
通常需要使用单引号或双引号来引起来,比如:
$name = “张三”;
整数类型:Int, Integer
浮点数: Float, Double
就是数学上的小数。
布尔类型: Bool, Boolean
这种数据类型只有两个数据:true, false

$is_graduate = true;
$hasMoney = false;

4.1.2. 复合类型:

就是“数组”(Array)和“对象”(Object)两种。

4.1.3. 特殊类型:

空类型: 有且只有一个数据可以使用,那就是null
资源类型:后续再说。。。。 resource

4.2. 整型****integer,int

1.2.1. 四种书写形式

整型分为正负整数
可以有4种直接书写的形式:

10进制形式:
$n1 = 123;
8进制形式:
$n1 = 123;  //以0开头  
16进制形式:
$n1 = 12A34;  //以0x开头,还可以有A,B,C,D,E,F这个6个“16进制数字”
2进制形式:
$n1 = 1011011010;  //以0b开头

下表为进制对比:

10进制 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
8进制 0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 20
16进制 0 1 2 3 4 5 6 7 8 9 A B C D E F 10
2进制 0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111 10000

4.2.2. 进制的相互转换

直接通过系统函数来进行,能完成:
10进制转为2, 8, 16进制:
decbin():将10进制转为2进制
decoct():将10进制转为8进制
dechex():将10进制转为16进制
或:
2, 8, 16进制转为10进制:
bindec():将2进制数字字符串转为10进制
octdec():将8进制数字字符串转为10进制
hexdec():将16进制数字字符串转为10进制
演示:

image.png

总结一下进制转换的单词:
dec:10进制
oct: 8进制
hex: 16进制
bin: 2进制
思考题:
怎么将一个8进制的数, 转换为16进制?思路:先把八进制转换成10进制,然后将10进制转换为16进制

4.3. 浮点型****float

浮点数就是相当于数学上的“小数”
两种书写形式:
直接小数点形式:

$f1 = 0.1;  //或者1.23;   123.0;
科学计数法
$f2 = 1.23e3;  //表示1.23 乘以10的3次方
$f3 = 123e2;  //这个也是浮点数,虽然其结果值是一个“整数”(12300)
//**特别注意:浮点数不要做相等比较(==)**:因为浮点数进行相等比较,是“不可靠”的:
$v1 = 0.1 + 0.2;
$v2 = 0.3;
问:$v1和$v2相等吗?

image.png

需要在考虑精度的基础上,将浮点数转换为整数,然后进行“比较大小”,此时,在精度范围内,如果相等,我们就认为是相等的
float:单精度浮点型 最大只有8位是精确 1.3456806789067890
double:双进度浮点型 最大可以有16位是精确 0.5678903456890456789034567890

4.4. 布尔型****Boolean

只有两个数据值: true, false(不区分大小写)
在需要当做“布尔值”进行判断或比较的时候,以下数据会被当作布尔值的 false:
false, 0, 0.0, “”, null, ‘0’, 空数组
其余都被当做布尔值的 true。


image.png

常见应用代码类似这样:

$v1 = 某某值;
if(  $v1  ) {  //此时,如果$v1为上述值之一,就会当做false,不执行其中的代码。
。。。代码。。。
}

//而对于其他值,就会当做true,因此就会执行其中的代码。


image.png

4.5. 字符串型****String

可以使用单引号或双引号来表示(引起来)。
表示一串“连续的字符”,最短的字符串是“空字符串”,比如:

$str1  =  “”。
注意:这个不是空字符串:  “  ”,  因为其中包括了1个空格字符。
$name  = “张三”;
$edu = ‘北京大学’;
$title = “关于微信应用的几个改进建议”;  //文章标题
$v1 = ‘’;  //这也是字符串(空字符串)
$v2 = ‘123’;  //这还是字符串
$v3 = “false”;  //这仍然是字符串

特别注意:
双引号字符串中,如果出现“$”符号,则该符号后的连续字符(单词)会被识别为一个变量名。
如果识别成功(即确实存在该变量),则会将该变量转换为实际内容。
如果识别失败(即实际没有该变量),则会报错。

4.6. 数组****类****型****Array

数组,就是将多个“数据”放在一起,排成一个序列,这个序列作为一个整体(里面包括了多个数据),就称为“数组”。比如:

$arr1  =  array(‘张三丰’,  18,  “男” );

或另一种形式:

$arr2  =  array(‘name’=> ‘张三丰’,  ‘age’=>18,  ‘gender’=> “男” );

数组的赋值:
$数组变量[下标] = 一个值;
数组的取值:
行为为:$数组变量[下标]
比如: echo $arr1[0]; print_r( $arr2[‘name’] );
其内部结构,可以这样去理解:
$info内部结构:

键名/下标/索引 0 1 2
‘张三丰’ 18 ‘男’

这种下标,通常称为“数字下标”。
$info2内部结构:

键名/下标/索引 ‘name’ ‘age’ ‘gender’
‘张三丰’ 18 ‘男’

这种下标,通常被称为“字符串下标”。

4.7. 空类型****NULL

只有一个值: null(不区分大小写)。
$v1 = null; //此时,具有变量$v1,但其中的数据是“空的”(没有数据)
空值变量,isset()判断的结果是false(即不存在)。
重点: 输出方式
echo:是PHP中最常用的一种输出方式,效率最高,不是函数,如果是以下几种数据类型,都是用echo进行输出: 字符串、整型、浮点型
语法: echo 变量/值
var_dump():是一个函数,它能够输出除了变量的值之外,还能输出其数据类型,一般有以下几个场景: 布尔类型、数组、对象、资源、想要知道变量数据类型的
print_r():是一个函数,跟var_dump()唯一的区别就是不能输出变量的数据类型

image.png

image.png

4.8. 类型****判断

gettype(): 获取一个变量的类型,结果为一个变量类型的名称(字符串)
$v1 = 10;
$r1 = gettype( $v1 );  //结果为:“integer”
$v2 = ‘abc’;
$r2 = gettype( $v2 );  //结果为:“string”
settype(): 设置一个变量的类型(数据类型的重新转换)
$v1 = 10;  //此时,$v1中数据是整数类型
settype( $v1,  ‘string’);  //此时,$v1是字符串类型,即其中的数据变成了:“10”

image.png

判断是否为某种类型(类型系列函数):
is_int() / is_integer():判断是否为整数类型
is_float():判断是否为浮点类型
is_bool():判断是否为布尔类型
is_string():。。。
is_array():。。。
is_numeric():判断是否为“数字”类型(含整数,小数,以及“纯数字字符串”)
is_object():
image.png

两个特殊判断:
isset(): 判断一个变量中是否有数据,如果有返回true,如果没有(即此时就是null)返回false
empty():判断是否为“空的”。如果确实是“空的”,返回true,否则返回false。
“空的”的意思,比较接近日常生活中的“没有”。
而空(null)是一个计算机中的特殊概念,表示“完全不存在”,可以理解为“真空”。
image.png

4.9. 类型转换

4.9.1. 自动转换

我们无需做任何处理,而是,程序会根据运算时运算符所需要的数据类型进行转换。
如果参与运算的数据不是需要的类型,则会自动转换为需要的数据类型。

$v1 = 1 + “3”;  //结果是4;
$v2 = 1  .  “3”;  //“.”是字符串连接符,这里,1会被转换为字符串,结果是:“13”

典型自动转换:
转换为数字:
1+”2” //3
“1”+ “2” //3
1 + ”2abc” //3
1 + ”2abc34” //3
1 + “abc” //1
1 + “abc2” //1
1.2 + “2” //3.2
1.2 + “2.2abc” //3.4
1.2 + “abc2.2” //1.2
“1.2abc” + 2 //3.2
“1.2abc”+ “2abc” //3.2
转换为整数:
10.8 % 3.6
“10.8” % “3.6”
“10.8” % “3.6abc”
“10.8ab” % “3.6cd”


image.png

4.9.2. 强制转换:

人为使用强转换语法进行转换,比如:

$v1 = (int) “1”;  //结果,$v1是整数类型的1
$v2 = (float)  “1.23”;  //结果,$v2是浮点类型的1.23
$v3 = (string) $v1;  //结果,$v3是字符串“1”

5. 算符详解

5.1. 概述:

5.1.1. 含义

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

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

单目运算符:
只需要一个数据——但必须是变量。
双目运算符:
需要两个数据——可以是变量,也可以直接的数据本身。
三元运算符:
需要3个数据才能运算,也称为三目运算符。
只有一个三元运算符。


image.png

5.1.3. 按功能分类

赋值运算符:
=
算术运算符:
+  -  *  /  %
连接运算符:
.
自赋值运算符:
+=   -=   *=   /=   %=   .=
自操作运算符:
++   --
比较运算符:
>   >=   <   <=  ==  !=   ===   !==
逻辑运算符:
&&(与)    ||(或)   !(非)
条件运算符:
数据1  ? 数据2   :  数据3
位运算符:
&   |   ~      
其他:
@,是错误抑制符
( ),括号,用于提升运算优先级,括号中的先运算。

5.2. 赋值运算符

只要理解一个核心的观念:
就是将等号(=)右边的数据(可能是运算结果数据)赋值给左边的变量。
看看一下写法:

$v1 = 1;
$v2 = 2;
$v3 = $v1 + $v2;
$v1 + $v2 = $v3;  //可以吗?不可以!
if(  $v1 + $v2 = $v3 ){....}  //可以吗???还是不可以!

一定记住,一个等号的左边,只能是一个“变量名”!
所以,这个写法是错误的: v2 + 3

5.3. 算术运算符

针对数字进行的算术计算,包括:+ - * / %
%:对整数数字进行“取余操作”——如果不是整数,会先自动转换为整数之后再进行取余。转换为整数的做法是:直接去掉小数部分
比如:

$v1 = 10  %  3;  //结果为1
$v2 = 10.8 % 3.6  //结果为1

如果不是数字,会自动转换为数字进行。


image.png

5.4. 连接运算符( . )

就是字符串的连接,能够将前后字符连接起来。
如果不是字符串,会自动转换为字符串。

$v1 = “ab”. “cd”;
$v2 = $v1 . “ef”;
$v3 = “ab” . 12;  //“ab12”
$v4 = 12  .  34;  //”1234”
$v5 = “12”  .  true;  //“121”,true转为字符串,为“1”;
$v6 = “12”  .  false;  //“12”,false转为字符串,为“”(即空字符串);

演示:

5.5. 自赋值运算符

针对数字的,包括: += -= *= /= %=
针对字符串的,只有一个:.=
形式:
变量 = $变量 + 数据;
此时,其实是相当于该变量的值,跟给定的数据进行运算后的结果数据,再放回到该变量中(覆盖了之前的数据)。

5.6. 自操作(自加自减)运算符

针对整数,只有2个:++ --
属于单目运算符,即只要一个变量就可以进行运算。
形式:

$变量++;  //对该变量中数据+1
$变量--;  //对该变量中数据-1
++$变量;  //对该变量中数据+1
--$变量;  //对该变量中数据-1
++讨论:
表示对该变量进行“自加1”操作。即该变量中的数据加1。
前自加:
后自加:

举例:

image.png

总结:
1,前自加,后自加,对变量本身的结果都是加1,没有区别。
2,但前自加、后自加如果跟别的运算符一起进行,此时区别为:
前自加:先发生自加,后做别的运算;
后自加:先发生别的运算,后自加。

5.7. 比较运算符

含义:
是针对数字的大小进行比较的运算。
如果不是数字,会自动转换为数字。
包括: > >= < <= == != === !==
所有比较运算符,运算的结果只有两个可能(之一): true 或 false
比如:
if( 1 == 2); //结果是false
等于(==)和全等于(===)的区别:
通常,等于(==)也会用“模糊相等”或“松散比较”的说法。
两个数据“基本相等”(类型可能会发生自动转换),就算是相等。
全等于(===)就是完全相等:
只有两个数据的数据类型一样,并且其值也一样的时候,才是全等。
查手册》》附录》类型比较表:


image.png

不等于: !=
两个数据不满足“==”这个运算结果,不等于(!=)的结果就是true,比如:
if( 1 != 2 ) //true
不全等于:!==
两个数据不满足“===”这个运算结果,不全等于(!==)的结果就是true,比如:
if( “1” !== 1 ) //true


image.png

5.8. 逻辑运算符

针对“布尔值”进行的运算,只有3个:
与: &&
或: ||
非: !
如果不是布尔值,会自动转换为布尔值去进行运算。
因为布尔值只有2个,不管怎么排列组合,最终只有以下10种情况的计算,几乎就是公式化。

5.8.1. 逻辑与(&&):

含义:
表示两个条件(数据)的真假结果是否同时为真的共同作用结果。
运算结果:只有两个条件都为真的时候,结果才是真(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 ){....}

5.8.2. 逻辑或(||):

含义:
表示两个条件(数据)的真假结果的是否存在“真”的情况的共同作用结果。
运算规则:
只要有任意一个条件为真(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 ){....}

案例:
判断某年是否为闰年(可使用表单输入的形式)
特点:能被4整除且不能被100整除或者能被400整除


image.png

5.8.3. 逻辑非(!):

就是对一个布尔值进行“取反”操作,规则为:
!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, 空数组,
还是查手册》附录》类型比较表:


image.png

image.png

5.8.4. 逻辑运算的短路规则:

短路:
就是对于“逻辑与” 或 “逻辑或”这两种运算符,他们可能会只进行左侧的逻辑判断之后,立即就中断后续(右侧)的判断,而得出整个逻辑运算符的运算结果!
if ( 左侧判断 && 右侧判断 )
if ( 左侧判断 || 右侧判断 )
举例:
判断一个整数(比如13)是否能被3整除并且能被5整除!
结论:
我们应该将我们可能发生短路运算的逻辑判断的前后判断语句,做如下调整:
相对简单的运算放前面(左侧),相对复杂的运算放后面(右侧)。
对于逻辑或的短路运算,道理一样。

5.9. 条件运算符(三目运算符)

只有一个条件运算符,形式为:
表达式1 ?表达式2 :表达式3
等同于
if(条件表达式){
条件表达式为真时,执行这里
}else{
条件表达式为假时,执行这里
}
含义:
如果表达式1为true(或自动转换后为true),则运算的结果值为表达式2,否则为表达式3。
举例:

$score = 77;  //分数
$v1 = $score >= 60  ?  “及格” : “不及格”;    //及格
其本质是:
$score = 77;  //分数
if  ( $score  >= 60 ){
$v1 = “及格”;
}else{
$v1 = “不及格”;
}

5.10. 位运算符(了解)

面试题:
计算结果: 3|5 3&5 3|4&5
针对整数进行的二进制级别的运算。
基本位运算符包括:按位与( & ), 按位或( | ), 按位非( ~ ), 按位异或(^)

5.10.1. 位运算基本运算规则:

位运算符有如下基本运算规则:
(只针对二进制的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

5.10.2. 整数的按位与(&)运算

含义:
是针对整数的二进制值进行的位运算结果。
$v1 = 6 & 8; //这里,虽然是普通整数,但其内部是按该整数的二进制形式进行位运算
运算规则:
将6和8的二进制数字的每一个对应位上的数字(0或1)进行基本的按位与(&)的运算所得到的结果。

数字6的二进制 0 1 1 0
数字8的二进制 1 0 0 0
按位与结果 0 0 0 0

结果:0
再来一个:
$v2 = 3 & 5;

数字3的二进制 0 1 1
数字5的二进制 1 0 1
按位与结果 0 0 1

结果:1
再来一个:
$v2 = 3 | 5;

数字3的二进制 0 1 1
数字5的二进制 1 0 1
按位与结果 1 1 1

结果:7
$v3=3|4&5 先后顺序: 先与再或

数字3的二进制 0 1 1
数字4的二进制 1 0 0
按位或结果 1 1 1
数组5的二进制 1 0 1
按位与运算 1 0 1

结果:5
实际结果是7

数字5的二进制 1 0 1
数字4的二进制 1 0 0
按位与结果 1 0 0
数组3的二进制 0 1 1
按位或运算 1 1 1

结果:7

5.11. 错误抑制符@

含义:
在一个表达式出现错误的时候,可以将错误“隐藏”(掩盖)起来(不输出)!
通常,该符号,用于在实际运行环境中的一些条件非我们(程序员)所能控制的情形。
如果出现该情形并报错,则我们可以抑制该错误的显示(只是该错误不显示,不是没有错误了)。

image.png

说明:错误抑制符只能抑制如“notice”“warning”之类的错误,“Parse”是无法抑制。

5.12. 运算符的优先级

运算符优先级不得不说的规则:
1,时刻意识到,运算符有优先级问题!
2,小括号可以改变运算的顺序(即括号最优先)
3,先乘除(以及取余)后加减;
4,大致有如此优先级规则:算术运算 > 比较运算 > 逻辑运算>赋值运算
5,赋值运算符通常都是最后(优先级最低)


image.png

细致的可以看手册。


image.png

你可能感兴趣的:(第3天 PHP数据类型及运算)