每一种编程语言都逃不开要做的事情就是数据类型。
在PHP中,支持的数据类型有8种。分别是
- 字符串(string)
- 整型(integer)
- 浮点型(Float)
- 布尔型(Boolean)
- 数组(Array)
- 对象(Object)
- 空值(NULL)
- 资源类型(Resource)
字符串
字符串作为使用非常广泛的数据类型,在日常的编程工作中的使用频率是非常高的。在PHP中,只要内存足够,字符串可以想有多长就有多长。
字符串必须是包裹在一对单引号或者双引号中的字符序列。
但是PHP引擎在解析代码的时候,对单引号字符串和双引号字符串的解析是有一些区别的。
- 如果是用
单引号包裹的字符串,那么PHP不会对字符串做特殊处理,仅仅是当做字符串进行打印或者传输。 - 如果是用
双引号包裹的字符串,那么PHP会:
- 变量替换 - 在PHP中,双引号包裹的字符串会进行变量替换。
- 如果有一个变量
$name = "John",在双引号字符串"Hello, $name"中,$name会被其实际的值John替换。
所以这个字符串最终会被解析为Hello, John。- 可以在双引号字符串中使用复杂的变量表达式。
比如有一个数组$user = array('first_name' => 'Jane', 'last_name' => 'Doe');,在双引号字符串"The user's full name is {$user['first_name']} {$user['last_name']}"中,{$user['first_name']}和{$user['last_name']}这样的语法可以正确地获取数组元素的值,最终字符串会被解析为The user's full name is Jane Doe。
- 转义字符解析
双引号中的转义字符会被正确解析。
例如\n会被解析为换行符。
$message = "This is a multi - line\nmessage";
当这个字符串被输出时(比如使用echo $message;),\n会使得This is a multi - line和message在不同的行显示。
其他常见的转义字符如\t(制表符)、\r(回车符)等也会按照它们的常规意义进行解析。
例如$tabbedText = "Column1\tColumn2";,输出这个字符串时,Column1和Column2之间会有一个制表符的间隔。
- 引号嵌套
如果要在双引号字符串中包含双引号本身,可以使用转义字符
\。
例如$quote = "He said, \"Hello!\"";
这样\"会被解析为一个普通的双引号字符,而不是字符串结束的标志。最终字符串会被解析为He said, "Hello!"。
整型
整型是用来存储整数的。
上过幼儿园的小朋友都知道,整数是只包含0-9这十个数字的,有正整数和负整数之分。
在PHP中可以用三种进制格式来指定整数,分别是十进制、十六进制(以0x为前缀)或八进制(前缀为0)。
举例说明
正整数:123
负整数:-123
十进制123:123
十六进制123:0x7B
八进制123:0173
在PHP中已经封装好了进制转换的函数。
- 十进制和十六进制相互转换的两个方法分别为:dechex(十进制转换为十六进制),hexdec(十六进制转换为十进制)。
- 十进制和八进制相互转换的两个方法为:decoct(十进制转换为八进制),octdec(八进制转换为十进制)。
这里只是记录了正整数的进制转换,负整数的转换则要复杂一些,具体操作方法可以问豆包
浮点型
在PHP中带小数的数字或者数字的指数形式的数据的数据类型就是浮点型。比如:1.5,1.500000e+08。
用过手机的小朋友都知道,计算机在进行浮点型运算的情况下,计算结果可能和你预计的结果不相同,他后边可能会多返回N位小数。
这是因为:
- 浮点数的存储方式导致精度问题 - 计算机中的浮点数是按照IEEE 754标准进行存储的。以单精度浮点数(32位)为例,它分为三个部分:符号位(1位)、指数位(8位)和尾数位(23位)。双精度浮点数(64位)则有更多的位数用于表示指数和尾数。 - 浮点数在存储时是通过科学计数法的形式。例如,十进制数123.45可能会被存储为类似于的形式(这只是一个简单的示例,实际存储更复杂)。在将十进制数转换为二进制的科学计数法形式存储时,很多十进制小数不能精确地转换为有限的二进制小数。 - 例如,十进制的0.1转换为二进制是一个无限循环小数。计算机在存储时只能截断或舍入这个二进制小数,这就导致了一定的精度损失。当进行计算时,这些微小的精度损失会累积,从而导致结果可能出现比预期更多的小数位。
- 计算过程中的中间结果精度保留 - 在进行浮点数计算时,计算机内部的运算过程会产生中间结果。这些中间结果的精度通常会比最终显示结果要求的精度高。 - 例如,当计算时,计算机可能会先按照二进制进行乘法运算。在乘法运算过程中,为了减少中间过程的精度损失,会保留较多的位数来存储中间结果。假设中间结果是(这是按照高精度计算得到的),如果最终显示要求是保留两位小数,那么正常情况下应该是。但如果中间结果没有进行适当的舍入处理,就可能会出现比预期更多的小数位。
- 不同编程语言和编译器的处理差异 - 不同的编程语言和编译器对于浮点数运算的处理方式略有不同。有些编程语言会在计算结束后自动对结果进行舍入处理,使其符合预期的精度;而有些则会尽可能地保留中间结果的精度,直到显示或者进一步处理阶段。 - 例如,Python语言在进行浮点数计算时,会按照一定的规则来处理精度。如果使用
print函数输出浮点数结果,它会根据默认的格式化规则来显示,这个规则可能会显示出比预期更多的小数位。而在一些其他语言中,如C语言,程序员可以通过格式化函数(如printf函数中的格式控制符)来控制浮点数的输出精度。
上边的内容是豆包解释的,所以我们得到了浮点数计算不准确的原因,但是整型计算是没有问题的。
所以在我们实际编程中,尤其是对钱进行计算的时候,要先将数据类型转换为整型,然后再进行计算,在计算完成之后再转换为浮点型。
布尔型
布尔型为true和false,没有什么可以解释的
数组
数组在PHP中是相当重要的一个数据类型,因为在我们实际的开发过程中,对数据的操作基本离不开数组。
那么,数组是什么?
在菜鸟教程的解释中,数组是一个能在单个变量中存储多个值的特殊变量。
怎么看这句话呢?
当我们在代码中定义了一个数组变量之后,我们可以将任意的数据类型放入到这个变量中,当然也包括数组数据类型。
而且数组的长度也会随着存入的数据自动扩展,不需要预先估计设定数组的长度和能够存储的数据的数量。理论上,数据能够存储和内存大小相同的数据量。
但是千万不要这么做,因为在实际开发中,如果内存占用太大会导致系统响应变慢等情况。就好像是你的系统出现了大bug一样。
操作数组
- 定义数组
定义数组有两种方式,第一种是使用array(),另外一种是直接用一对方括号 [] 即可。
$a = array(1,2,3);
$b = [2,3,4];
- 向数组中写入元素
向数组中写入元素有两种写入方式
一种是按照数组自增索引的方式写入。读取的时候也可以通过数字形式的key读取数组中的元素。
另外一种是给要写入数组的数据指定一个确定的key,读取数据的时候用指定的key进行读取即可。
如果在写入数据的时候,数组的数字索引或者给出的确定的key已经存在了,那么就会覆盖数组中原有的数据。
$a = [];
$a[] = 1;
$a['b']='c';
- 获取数组的长度
可以使用count()方法方便的获取到数组的长度。
- 遍历数组
遍历数组可以用两个方法,分别是for和foreach。
- 读取数组中的元素
读取数组中的元素可以用数组索引或者指定的key进行读取。
如果为数组中的元素指定了索引,那么就用索引读取
$a = ['a' => 111, 'b' => 222, 'c' => 333, 'd' => 444, 'e' => 555];
echo $a['b'];
如果读取的key不存在,那么就会返回一个NULL。
如果没有指定确定的索引,那么就用数组的数字索引读取。
$a = [111,222,333,444,555];
echo $a[1];
如果读取的数字索引不存在,那么就会返回一个NULL。
数组方法
在PHP中,预定义很多操作数组的方法,这些方法让我们在编程中省掉了很多麻烦。
从PHP官网中,我们可以查看到这些数组。
PHP官网中的查看数组的URL地址为:PHP数组函数。
我数了一下,一共有91个,基本涵盖了我们能使用的方方面面,这里不再展开,有兴趣可以去看官网。
NULL值
NULL值表示变量没有值。
可以设置变量的值为NULL来清空变量的数据。
在使用empty或者使用(==)进行空值判断的时候,NULL,'',"",0,false都会判定为true。
但是他们不是相同的数据类型。
如果需要根据这些数据确定的数据类型来处理数据的话,可以使用三个等号(===)。
对象
对象数据类型也可以用来存储数据。
在PHP中,对象必须声明。
必须是用class关键字声明对象。
这里就涉及到了面向对象编程。
在我们实际的业务开发中,经常能够看到对象的时候,但是因为框架封装的太好了,我们开箱即用即可,不需要过多的关心。
一般情况下,我们只是知道OOP的概念。但是我们却不去太关心它。
在laravel、thinkphp、Yii框架中,我们在使用model、controller的时候,就经常用class来定义类,然后在类中声明类的属性和方法。然后在需要调用的地方调用之。
举个例子
我们定义一个model,在model中定义属性和方法用来操作数据,然后需要在controller中调用model中的方法用来封装成接口方法向客户端提供服务。
那么,我们通常的做法是先new一个model的对象,然后调用这个对象中的方法。或者使用静态调用的方式调用model中的方法。
这就是在使用PHP中的对象在开发业务。
资源类型
在菜鸟教程中的解释是:PHP 资源 resource 是一种特殊变量,保存了到外部资源的一个引用。常见资源数据类型有打开文件、数据库连接、图形画布区域等。
所以我们可以将文件、数据库、图片等外部数据信息都理解为资源。
以上就是我对PHP数据类型的一些理解。