提问:PHP变量赋值的时候有的地方有引号,有的不需要引号,为什么呢?

回答:数据类型

目标:了解PHP中数据分类的依据和对应的类型

概念

数据类型:数据类型在数据结构中的定义是一组性质相同的值的集合以及定义在这个值集合上的一组操作的总称。

  • PHP变量没有数据类型:弱类型,可以存储任何数据
  • 只有数据是进行分类的

PHP中数据类型分为三大类八小类

  • 基本数据类型

    • 整形(int/integer):整数数据
    • 浮点型(float):小数数据和超过整形范围的整数数据
    • 布尔型(bool/boolean):布尔类型数据,只有true和false两个值
    • 字符串型(string):字符串数据(最常见)
  • 复合数据类型

    • 数组型(array):数组数据(即多个数据存放到一个变量中)
    • 对象型(object):对象数据,由类实例化得到(面向对象)
  • 特殊数据类型

    • 资源型(resource):资源数据(数据库资源文件资源)
    • 空型(null):没有存储任何数据

示例

利用var_dump()可以查看变量的详细情况:数据大小(或长度),数据类型

$a = 100;
$b = 'hello';
var_dump($a,$b);    #多个可以一起(var_dump通常在开发阶段用来检查结果的正确性)
#打印结果:
#int(100)             #int类型,值为100
#string(5) "hello"    #string类型,长度为5个字节,值为hello

小结

1、数据分类是根据数据的性质的同一性进行分类

2、PHP中将数据分成8类

  • 整型:整数
  • 浮点型:小数和超出整数范围的整数
  • 布尔型:是和否
  • 字符串型:字符串数据
  • 数组型:数组数据
  • 对象型:对象数据
  • 资源型:资源数据
  • 空型:没有数据

3、可以使用var_dump来查看数据的具体类型和结果详情

4、对象型、资源型和空型需要学习到一些高级知识时会碰到,暂时不细讲

6.1、整型

目标:掌握整型数据的定义和输出方式

概念

整型:数据是整数,但是根据进制方式不同,有不同的数据格式

  • 十进制:默认,逢十进一,有0-9共十个符号,阿拉伯数字即可,如123
  • 八进制:逢八进一,有0-7共八个符号,起始使用0标志,如0123
  • 十六进制:逢十六进一,有0-9、a-f共16个符号,起始使用0x标志,如0x123
  • 二进制:逢二进一,有0-1共两个符号,起始使用0b标志,如0b101

示例

#整型
$int1 = 123;    #默认十进制
$int2 = 0123;    #八进制表示
$int3 = 0x123;    #十六进制表示
$int4 = 0b101;    #二进制表示

虽然定义数据的时候可以使用多种进制表示,但是显示数据的时候,默认PHP都会转换成10进制输出

#接上述代码
echo $int1,$int2,$int3,$int4;    #123,83,291,5

如果想要保持原来的进制输出,就需要使用printf(格式,数据1,数据2...)来实现

#接上述代码
printf('%d',$int1);        #十进制输出$int1
printf('%o',$int2);        #八进制输出$int2
printf('十六进制是%x,二进制是%b',$int3,$int4);

注意:整数最大保存空间为PHP_INT_SIZE的值,即8个字节(PHP7以前是4个字节),能表示的最大值是PHP_INT_MAX的值,最小值是PHP_INT_MAX + 1的负数(PHP支持正负数)

echo PHP_INT_SIZE;        # 4
echo PHP_INT_MAX;        # 9223372036854775807,最小值是 -9223372036854775808

小结

1、整型就是保存的是整数

2、整数的形式有多种,有不同的定义方式:

  • 十进制:直接0-9定义
  • 八进制:前面使用0,后跟0-7
  • 十六进制:前面使用0x,后跟0-9+a-f
  • 二进制:前面使用0b,后跟0-1

3、PHP不管定义时采用的是什么整型,输出都默认转换成十进制

4、想要保留原来格式,或者指定格式输出整数,使用printf()

  • 十进制:%d
  • 八进制:%o
  • 十六进制:%x
  • 二进制:%b

5、PHP中整型是有符号类型(有正负)

  • 最大值:PHP_INT_MAX
  • 最小值:-PHP_INT_MAX - 1

6.2、进制转换

目标:了解进制的原理,知道PHP中有进制转换的快捷函数

概念

进制转换:是指根据不同的进制要求,将原始数值(通常指整数)转换成目标进制。

  • 二进制与十进制互转
  • 二进制与八进制互转
  • 二进制与十六进制互转
  • 八进制与十进制互转
  • 八进制与十六进制互转
  • 十进制与十六进制互转

原理

任意进制转十进制的通用方法

二进制转八进制或者十六进制

  • 二进制转八进制:从右边开始依次取三位转换成十进制,将所有结果合并即可(三位二进制最大7:111=>7)

11111111 => 11,111,111 => 3,7,7 => 377

  • 二进制转十六进制:从右边开始依次取四位转换成十进制,将所有结果合并即可(四位二进制最大15:1111=>15 == F)

11111111 => 1111,1111 => F,F => FF

  • 八进制转二进制:每位数转换成三位的二进制,将所有结果合并即可

123 => 1,2,3 => 001,010,011 => 00101011 => 101011(左侧的0可以忽略)

  • 十六进制转二进制:每位数转换成四位的二进制,将所有结果合并即可

123 => 1,2,3 => 0001,0010,0011 => 000100100011 => 100100011

简化

在PHP中,已经考虑到业务的需求,所以PHP提供了一系列函数来实现各类进制转换,以十进制为基准

  • bindec:二进制转十进制
  • decbin:十进制转二进制
  • decoct:十进制转八进制
  • octdec:八进制转十进制
  • dechex:十进制转十六进制
  • hexdec:十六进制转十进制
#示例:十六进制转十进制
hexdec('123');        #结果:291

小结

1、进制转换原理可以以10进制为基准互转

2、PHP提供了一套以十进制为基准的转换函数,利用十进制与其他进制组合成单词即可实现函数转换

  • 八进制:oct
  • 十进制:dec
  • 十六进制:hex
  • 二进制:bin

6.3、浮点型

目标:掌握浮点型的概念和注意事项

概念

浮点数:即有小数点的数或者数值超过整型能表达的最大数

  • 小数:1.2或者0.12
  • 科学计数法产生的数:4E3 == 4 * 10 ^ 3
  • 超过整型的数: PHP_INT_MAX + 1
  • 浮点型存储空间:8个字节

浮点数是有有效位的

  • 精度 ==> 精确度
  • PHP7中的有效精度是13-14位,即数据如果有效数字超过该值,就会自动被四舍五入

    • 13位:肯定精准
    • 14位:如果只有14位数字,那么精准;如果超出14位,第十四位是四舍五入的结果
  • PHP7中浮点数最大表示:1.8e308

示例

#以下都是浮点数
$f1 = 1.2;
$f2 = 4e5;
$f3 = PHP_INT_MAX + 1;

浮点数存储原理简介

浮点数分为整数部分和小数部分,转换成二进制的方式有所不同,10.5举例

  • 整数部分:十进制转二进制正常转即可,如10 => 1010
  • 小数部分:小数乘以2,取整数部分,如 0.5 * 2 = 1.0,取1(如果还可以取,继续乘以2)
  • 浮点数一共用8个字节存储,即64位,其中

    • 最左侧第一位是符号位:0表示正数,1表示负数
    • 从左侧开始第2位-54位存储数值
    • 剩余9位存储幂:即10的N次方,N最大为308

扩展

1、浮点数适合运用在精度要求不高的地方(如果确定精度不会超过14位,那么浮点数是精准的)

2、浮点数不适合进行运算后的精确比较(因为小数部分转换成二进制的时候是*2的出来的,取不尽就会丢失精度)

  • 38.1 / 2.7 比较,计算机是不会算出相等的结果的

小结

1、浮点数是用来表示小数、科学计数法数以及超过整数大小的整数的

2、浮点数是有精度范围的,PHP7中精度为14位有效数字

3、浮点数采用8个字节存储:存储原理为: 符号位 + 54位数值位 + 9位指数位

4、浮点数的应用不建议在精度要求较高(超过14位)的地方使用

5、浮点数不适合进行精确比较(浮点数运算结果)

6.4、布尔类型

目标:了解布尔类型的值,掌握布尔类型的应用意义

提问:程序中如何表达==行==和==不行==呢?

回答:布尔值

概念

布尔类型:专门用来做判定结果的,只有两个值

  • true:表示真(是)
  • false:表示假(false)

示例

#布尔表达式
$res = true;    
$res = FALSE;        #PHP中不区分布尔的大小写

注意:布尔值通常不会用来做结果保存,而是用来进行过程判定

小结

1、布尔类型只有两个值:true和false

2、布尔值不区分大小写:true和TRUE一样

3、布尔类型通常不是用来做存储数据,而是程序用来进行过程或者结果判定使用

6.5、字符串型

目标:掌握字符串的不同定义方式,以及各个方式的区别

概念

字符串:字符串是由数字、字母和下划线组成的一串字符

字符串是编程中用到最多的数据格式,有多种定义方式:

  • 单引号包裹:使用英文单引号''包裹字符
  • 双引号包裹:使用英文双引号""包裹字符
  • 定界符包裹:使用PHP中的定界符<<<标识符 + 标识符结尾形式包裹(多行字符串的一种形式)

    • heredoc结构:双引号的一种多行字符串形式
    • nowdoc结构:单引号的一种多行字符串形式

示例

#单引号字符串
$str1 = 'hello world';
#双引号字符串
$str2 = "hello world";
#定界符:heredoc:注意EOT并非固定,自己取名即可(但不要与关键字同名)
$str3 = <<<EOT
    $str1
EOT;
#输出:hello world

#定界符:nowdoc
$str4 = <<<'EOT'
    $str1
EOT;
#输出:$str1

区别

1、单引号是最简单字符串

  • 里面能解析少量转义符:单引号('),反斜杠(\\)
#单引号解析
$a = 100;
$str = 'abcdefg\r\n\t\'\"\\$a';        #输出:abcdefg\r\n\t'\"\$a
#单引号被解析',反斜杠被解析\,其他均不解析

2、双引号相对单引号功能较多

  • 里面能解释较多转义符:$符号(\$),双引号("),反斜杠(\\),回车换行符(rn),tap符(t)
  • 里面如果有PHP变量,也可以被解析
#双引号解析
$a = 100;
$str = "abcdefg\r\n\t\'\"\\$a";        #输出:abcdefg  \'"\100
#\r\n转换成换行空格,单引号不解析\',双引号解析",反斜杠解析\,$a被解析100

3、定界符中heredoc与双引号效果一致,nowdoc与单引号一致

  • 定界符会自动保留格式:即如果内部字符串有换行之类的会自动保留

注意

1、双引号解析变量时,系统是有规矩匹配变量的

  • 变量名不要与其他字母或者数字保留在一起:如"$abc"系统会自动识别​$abc,而不是$a

    • 解决方案1:让变量与后面的内容之间有空格,如"$a bc"系统识别$a(此时会额外多出一个空格)
    • 解决方案2:使用{}将变量独立包裹,如"{$a}bc"系统识别$a(建议)

2、使用定界符定义多行字符串时有很多规矩

  • 定界符内的所有内容都是字符串的内容(包括注释)
  • 定界符的起始符号之后不能有任何信息,包括空格
  • 定界符的结束符号必须顶格
  • 定界符的结束符号后同样不能有任何信息
#错误示范1:定界符起始符号后有内容
$str = <<<EOT #这是起始
    hello world
EOT;

#错误示范2:定界符结束符号不顶格
$str = <<<EOT
    hello world
    EOT;

#错误示范3:定界符结束符号后有内容
$str = <<<EOT
    hello world
EOT;    #字符串结束

小结

1、字符串是程序编码中应用最多的一种类型,可以使用多种方式定义

  • 单引号定义
  • 双引号定义
  • 定界符定义

    • heredoc定义:代替双引号
    • nowdoc定义:代替单引号

2、单引号与双引号有区别

  • 单引号解析的转义符号较少:'和\\
  • 双引号解析的转义符号较多:"、\\、rn、t、\$
  • 双引号中可以解析变量,但要注意变量的规则

    • 让变量名与其他可能让系统误解的符号分开
    • 给变量名增加一个{}

3、使用定界符的时候要注意定界符的严格要求

  • 起始符号后不能有任何内容(包括空格)
  • 结束符号必须顶格
  • 结束符号后不能有任何内容

6.6、数组类型

目标:掌握数组的定义、元素添加以及元素访问方式,了解数组所代表的作用

举例子

数组概念

提问:一个PHP变量中能不能保存多个数据呢?

回答:可以,数组

概念

数组:多个元素的序列组合

  • 数组由元素组成
  • 元素由下标key和值Value组成(键值对 键 => 值)

    • 如果元素下标都是数字:索引数组
    • 如果元素下标都是字符串:关联数组
    • 如果下标有数字也有字符串:混合数组
  • 数组元素的访问需要通过下标实现
  • 数组通常用来保存一组相关的数据,而不是随意搭配

步骤

1、定义数组

  • 空数组:值为array()或者[]
  • 非空数组:['张三'](只显示的放了值,下标键是自动生成)
  • 多元素数组:使用逗号分隔元素['张三','男',30]
  • 指定下标数组:['name' => '张三','gender' => '男', 'age' => '30']

2、添加元素

  • 使用保存数组的变量后加上[],表示一个系统自动指定下标,然后等于某个值
  • 使用保存数组的变量后加上[1],表示指定下标为1(可以是字符串),然后等于某个值

3、访问元素

  • 通过变量后加上[1],必须指定元素下标,访问某个元素
  • 如果直接使用变量,表示访问整个数组(不能echo输出)

4、修改元素

  • 通过数组变量加上[1],修改指定下标对应的元素,等于某个新值即可

5、删除元素

  • 使用unset(),然后指定数组变量加上[1],删除指定下标
  • 使用unset(),指定变量删除整个数组

示例

#定义数组:空数组
$arr1 = array();
$arr2 = [];

#定义非空数组
$arr3 = [1];                #单个元素
$arr4 = ['张三','男',30];      #多个元素:没有指定下标,下标从0开始自然增长
$arr5 = ['name' => '张三'];  #指定下标,下标可以是数字也可以是字符串

#添加元素
$arr1[] = 10;                #添加一个元素值为10,下标系统自动给(第一个元素是0)
$arr2['gender'] = '女';        #添加一个元素下标为gender,值为女

#访问元素
echo $arr4[0];                #张三
echo $arr5['name'];            #张三

#修改元素
$arr5['name'] = '王五';        

#删除元素
unset($arr4[1]);            #删掉 男 这个元素
unset($arr4);                #删除整个数组

注意

1、索引数组(纯数字下标)添加元素,默认以当前元素最大的下标开始自动加1

2、索引数组通常都不会刻意指定下标(从0开始自增长)

3、一般数组很少使用混合数组(要么下标全数字,要么下标全字符串)

4、PHP数组特点

  • PHP数组中的元素没有数量限制,即数组不限定长度
  • PHP中数组可以动态增加元素
  • PHP中数组元素的值可以是任意数据类型
  • PHP中数组下标可以是纯数字(索引数组)、纯字符串(关联数组)和混合数字和字符串(混合数组)

小结

1、数组是多个数据元素的集合保存

2、数组元素由下标和值组成,下标可以是数字或者字符串,值可以是任意数据类型

3、一个数组通常存储的是一组相关数据,如个人信息

4、数组的定义方式有多种

  • 空数组:$arr = array() / $arr = []
  • 有元素:$arr = [1] / $arr = ['name' => '习大大']

5、数组元素的访问、修改和删除,都是通过数组下标实现

6、PHP中数组根据下标组成可以分为多种

  • 索引数组:所有元素下标全是数字
  • 关联数组:所有元素下标全是字符串
  • 混合数组:元素下标有数字的也有字符串的(基本不使用)

6.7、二维数组

目标:了解二维数组的作用以及常见的数据存储形式

提问:一个数组是用来保存一类相关信息的,那么如果有很多个具有很多信息的数据该如何存储呢?

答案:二维数组

概念

二维数组:数组中的元素本身也是一个数组,我们就称之为二维数组

  • 二维数组的元素都是一个一维数组
  • 二维数组的第一维的下标通常是索引,第二维是关联

多维数组:PHP中理论上不限定数组的层级,当数组元素本身又是一个二维数组的时候,就是多维数组

  • 数组维度超过二层即可为多维数组

步骤

1、定义一维数组,保存到变量

2、定义一个新数组,将原来的数组保存到新数组元素中

3、数组访问先通过一维下标找到对应的元素,然后通过二维下标找到更深的元素

示例

#定义一维数组
$p1 = array('name' => '鸣人','skill' => '影分身');
$p2 = array('name' => '佐助','skill' => '千鸟');

#定义二维数组
$p = array($p1,$p2);        #$p1元素的下标为0,$p2的下标为1

#访问元素:通常是访问二维元素
#获取第一个元素的名字
echo $p[0]['name'];

#追加一个数组元素
$p[] = array('name' => '小樱','skill' => '治疗术');

小结

1、二维数组就是数组中的元素都是一维数组

2、多维数组在PHP中也允许出现,就是数组的层级大于3层,但是尽量不要超过3层(效率低)

3、二维数组的存储形式通常规则如下

  • 一维数组元素下标为数字(索引数组:外层)
  • 二维数组元素下标为字符串(关联数组:内层)

4、不管数组有多少层,所有的访问都是以下标一层一层寻找:$变量[一层下标][二层下标][...N层下标]

6.8、类型判定

目标:掌握类型判定的意义,了解类型判定的常用方法

提问:PHP在进行数据操作的时候,需要用到某些特定类型的数据,PHP如何知道呢?

回答:类型判定

概念

类型判定:即对存储数据的变量(本质是数据)进行类型确定

PHP提供了一套类型判定的函数,以供使用

  • 函数不需要拼命记住,都是以is_ + 数据类型 组成
  • 函数在操作手册中都有,输入is_ 即可查到所有

常用类型判定

系统提供的类型判定很全,有几个特殊的需要了解一下

  • is_numeric:判定数据是否是数值,如果是返回布尔TURE,否则返回FALSE
  • is_scalar:是否是标量(基础类型)数据,如果是返回布尔TRUE,否则返回FALSE
  • 类型代表:is_int,判定是否是整型数据,如果是返回布尔TRUE,否则返回FALSE

示例

#定义变量
$num = 100;
$str = '100';

#判定
var_dump(is_int($num));            #TURE,100是整数
var_dump(is_int($str));            #FALSE,虽然值是100,但是用引号包裹的是字符串
var_dump(is_numeric($str);        #TRUE,is_numeric只要是数值都可以,包括数值型字符串
var_dump(is_scalar($num));        #TRUE,100是整型,是基础类型
var_dump(is_scalar($str));        #TRUE,'100'是字符串,是基础类型

小结

1、类型判定是因为某些特定情况下,需要保证数据格式能对上

  • 不要相信任何外来数据:保证程序的安全和逻辑完整性

2、类型判定是用到PHP提供的系统函数,函数以is_ + 数据类型

  • is_int:判定整型(is_integer)
  • is_float:判定浮点型
  • is_bool:判定布尔型(is_boolean)
  • is_string:判定字符串型
  • is_null:判定空型
  • is_array:判定数组型
  • is_resourse:判定资源型
  • is_object:判定对象型

3、常见的数据类型判定,有两个额外的判定函数

  • is_numeric:判定是否是数值或者数值型字符串
  • is_scalar:判定是否是基础数据类型(整型、浮点型、布尔型、字符串型)

6.9、类型转换

目标:了解类型转换的原因,掌握类型转换的逻辑

提问:如果某项数据的类型如字符串100,而要参与计算的是数值运算,要怎么办?

回答:类型转换

概念

类型转换:即将某种不符合的类型转换成目标类型

  • 自动转换:系统自动转成目标类型(方便)
  • 强制转换:通过代码强制转换成目标类型(效率高)

步骤

1、自动转换

  • 系统自动检测所需要类型
  • 系统自动检测数据的类型
  • 系统自动转换成目标类型(不改变数据本身)

2、强制转换

  • 明确所需要类型
  • 强制转换成所需类型

    • 不改变原来数据:在数据前使用(目标类型),如(boolean)$a,将变量$a的值取出来转成布尔结果
    • 改变原来数据:使用settype(变量,'目标类型'),如settype($a,'bool'),将变量$a的值转成布尔结果
  • 强制转换的类型:资源和NULL不能强制转换

    • integer:转换成整型
    • float:转换成浮点型
    • bool:转换成布尔类型
    • string:转换成字符串类型
    • array:转换成数组类型
    • object:转换成对象类型

示例

#定义数据:假装是外来数据
$num1 = 5;
$num2 = '1.23a';

#算术运算:求和(自动转换):只能是数值操作
echo $num1 + $num2;                        #6.23
#系统判定当前是加法操作,需要数值类型(整型|浮点型)
#系统判定当前参与运算的数据类型:$num1是整型,$num2是字符串型
#系统自动转换不符合目标的类型编程目标类型:$num2 ==> 数值型(浮点型) ==> 1.23

var_dump($num2);                    #string(5),依然是字符串,值也是'1.23a',没有改变

#算术运算:求和(强制转换):只能是数值操作(不改变类型
echo (float)$num1 + (float)$num2;    #6.23

var_dump($num1,$num2);                #int 100, string(5) '1.23a'

#强制转换:改变类型(一般比较少用,除非是特定位置)
settype($num1,'float');
settype($num2,'float');

var_dump($num1,$num2);                #float 100,float 1.23

常见的转换逻辑

1、字符串转数值

  • 纯数值字符串 =》相应数值:'123.1' => 123.1
  • 数字开头但有字母 =》 保留数字部分:'12a' => 12
  • 小数点开头 =》 保留第一个小数点及之后的连续数字:'.1.1.a' => 0.1
  • 字母开头 =》 0:'a123' => 0

2、其他类型转布尔:极少转换后是FALSE,基本都是TRUE,以下除外

  • 布尔FALSE转布尔:FALSE
  • 整型0转布尔:FALSE
  • 浮点型0.0转布尔:FALSE
  • 空白字符串''和字符串'0'转布尔:FALSE
  • 空数组array()转布尔:FALSE(比较多运用)
  • 空类型NULL转布尔:FALSE

小结

1、类型转换是根据目标需求(运算)将数据变成目标格式

  • 自动转换(PHP用的最多):系统自动识别
  • 强制转换(建议):开发者限定

    • 对值进行类型控制:在变量前使用:(目标类型),不会改变变量本身
    • 对变量进行类型重置:使用settype,会改变变量

2、类型转换逻辑

  • 字符串转数值
  • 其他类型转布尔

    • 较多转都是布尔true
    • 极少数转成false
Last modification:February 11th, 2020 at 07:04 pm