PHP数据类型
php 支持 9 种原始数据类型。
- 四种标量类型:
- boolean (布尔型)
- integer (整型)
- float (浮点型,也称作double)
- string (字符串)
- 三种复合类型:
- array (数组)
- object (对象)
- callable (可调用)
- 两种特殊类型:
- resource (资源)
- null (无类型)
整型
整数是集合 z = {..., -2, -1, 0, 1, 2, ...} 中的某个数。整数不包括小数、分数。
(1) php不支持无符号整型(unsigned),即php中的整数都是有符号的。
(2) 整型数据所占的字节数和平台有关,通常是8个字节,可以通过输出php_int_size
来检查int型数据所占字节数
(3) 整型所能表示的最大数(64位系统,8字节)为9223372036854775807,可以通过输出预定义常量php_int_max
来检测整型所能表示的最大数,如果超出这个范围,那么这个数据就会被解释为float型,如果超出float型则这个数据就会被解释为无穷大(inf)
(4) 整型可以用三种格式来指定:十进制、十六进制(以0x为前缀)、八进制(以0为前缀)。
浮点型
浮点数是带小数部分的数字,或是指数形式。
(1) 浮点数的字节长度和平台相关,通常最大值是1.8e308,并且具有14位十进制数字的精度,小数的精度从数字的左边第一个不为0的数开始算起。
(2) 由于浮点数有精度损失,所以当我们对浮点数进行比较的时候(指含有运算的)最好不要在if条件语句中判断一个结果为浮点数的变量是否和另一个浮点数相等,比如下面的表达式
$a = 0.1; $b = 0.2; $c = 0.3; ======> ($a + $b - $c) != 0;
如果实在需要比较,那么我们可以设置一个极小值,然后判断两个浮点数的差的绝对值(求浮点数的绝对值用abs()
函数)是否小于我们设置的这个极小值,如果小于这个极小值我们基本可以认为他们是相等的。
这些精度损失一般发生在运算的过程中,如果我们直接比较两个不含运算的浮点数,则不会出现上述问题。例如
$a = 0.1; $b = 0.1; =====> 则$a和$b是相等的
字符串
一个字符串 string 就是由一系列的字符组成,其中每个字符等同于一个字节。这意味着 php 只能支持 256 的字符集,因此不支持 unicode 。
注意:string最大可以达到2gb。
(1) 在php中,既支持用单引号包围字符串也支持双引号包围字符串。但是单引号和双引号是有区别的,说明如下:
单引号:单引号不会解析$,但是执行效率高,速度快。因此建议能用单引号的地方尽量用单引号。单引号会原样输出单引号内的内容,无论有没有变量。
双引号:双引号会解析$,但执行效率比单引号要稍微低一些。如果一个字符串中有php变量需要解析,则应当使用双引号。
(2) 如果双引号中有比较复杂的变量,则要求使用{}括起来,否则无法解析。
$tag = "你好!"; $arr = ['name' => 'itbsl', 'age' => 18]; //php能解析$tag变量,但是却无法直接解析$arr['name']和$arr['age'],在运行时会报错。 $str = "$tag, $arr['name']的年龄是$arr['age']"; //错误用法 //对于复杂变量,比如数组,加上大括号告诉php,括起来的要当成变量处理。 $str = "$tag, {$arr['name']}的年龄是{$arr['age']}"; //正确用法 echo $str;
(3) heredoc使用
示例:
$arr = ['name' => 'itbsl', 'age' => 18]; $str = <<<htmlstr <h1>hello,world</h1> <h1>hello,world</h1> <h1>hello,world</h1> <h1>{$arr['name']}</h1> htmlstr;
1. 相当于双引号,也被称为双引号标识符,标识符中的$会被解析,特别适合大量的html代码 2. `<<<`代表界定符号 3. htmlstr指标识符,一般是大写,不过标识符名字可以自己随意指定。 4. 上面的标识符后面一定不要有任何的字符,包括空格 5. 下面的标识符要与上面的标识符名字保持一致,必须的 6. 下面的标识符前面不要有任何字符包括空格,要顶格写 7. 标识符中间的代码可以随机写,没有上面那些严格的限制 8. 以上只对php7.2以前有效(php<=7.2),php7.3对heredoc和nowdoc进行了改进,在使用上更加方便了,没有那么多的限制,想了解详情可以到php官网查看
(4) nowdoc使用
nowdoc与heredoc的用法基本一致,只有两点不一样,一个是nowdoc的上面的标签需要单引号引起来,而heredoc不需要。第二点区别是nowdoc不会解析标识符内的$,也就是说不会解析标识符内的内容,即使里面有变量也不会解析,类似于单引号的用法,所以nowdoc也称作单引号标识符
(5) 在字符串中调用函数
如果在双引号包裹的字符串中有{$变量名()}
的形式,php引擎就会查找有没有和这个变量的值同名的函数,如果有的话就会调用和这个变量的值同名的函数。
示例:
function test() { return 'itbsl'; } $name = 'test'; echo "hello, {$name()}";
运行代码,会输出hello, itbsl
(6) 计算字符串的长度的函数是strlen()
不能用count(),count()函数是用来计算数组的长度的,如果我们用count()计算一个字符串的长度,无论这个字符串多长,用count统计的结果都将是1.即使是一个空字符串用count()函数统计的结果都是1.
其它类型数据也可以使用字符串处理函数,不过是先将其它类型自动转换为字符串再处理。比如用strlen(10000),函数会先将10000转换为字符串“10000”,然后在处理,所以它的长度是5.
(7) 字符串可以像数组一样,通过下标来访问每个字符。但是字符串不是数组,例如一个字符串$str =
'hello';如果我们想输出字符串的前两个值,我们可以echo $str[0].$str[1];或者echo
$str{0}.$str{1};(建议字符串用大括号访问,这样可以和数组区分。)
布尔型
布尔型可以是 true 或 false。
要指定一个布尔值,使用常量 true 或 false。两个都不区分大小写。
布尔型通常用于条件判断。
以下值在php中都会被当做false对待:
- 布尔值false自身
- 整型值 0
- 浮点型值 0.0
- 空字符串,以及字符串“0”(需要注意字符串值为“0”的情况)
- 不包含任何元素的数组
- 特殊类型null(包括尚未赋值的变量)
- 从空标记生成的simplexml对象
数组
php 中的数组实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合,栈,队列以及更多可能性。由于数组元素的值也可以是另一个数组,树形结构和多维数组也是允许的。
定义数组语法:
//方式一: array(key => value, key2 => value2, ...); //方式二:短数组定义语法 [key => value, key2=>value2, ...] 说明: //键(key)可以是一个整数integer或字符串string //值(value)可以是任意类型的值
示例:
//方式一 $arr = array('name' => 'itbsl', 'age' => 18); //方式二 $arr = ['name' => 'itbsl', 'age' => 18];
最后一个数组单元之后的逗号可以省略。通常用于单行数组定义中,例如常用 array(1, 2) 而不是 array(1, 2, )。对多行数组定义通常保留最后一个逗号,这样要添加一个新单元时更方便。
注意:
(1)“+”:两个数组相加,如果两个数组有相同的键,则后面相同的键不会被加进去
(2)“==”:可以判断两个数组是否含有相同的键值对
(3)“===”:可以判断,两个数组是否含有相同的键值对,而且顺序一样,而且数据类型也要一样。
资源类型
资源 resource 是一种特殊变量,保存了到外部资源的一个引用。资源是通过专门的函数来建立和使用的。
null
特殊的 null 值表示一个变量没有值。null类型唯一可能的值就是 null,不区分大小写。
下列情况的变量值被认为是null:
- 被赋值为null
- 尚未被赋值
- 被unset()
对象
其广义指的是在内存上一段有意义的区域,称作为一个对象。
callable
自 php 5.4 起可用 callable类型指定回调类型 callback。
一些函数如 或 可以接受用户自定义的回调函数作为参数。回调函数不止可以是简单函数,还可以是对象的方法,包括静态类方法。
基本数据类型的转换
自动转换
自动转换是由低到高的,boolean -> int -> float
注意:当一个整型或者浮点型数据与字符串型数据进行运算时会比较特别,举例如下
定义三个变量,分别为整型、浮点型、字符串型:$a = 4; $b = 4.5; $c = '12fff';
当计算$d = $a + $c;时,输出$d的结果为16,输出数据类型为整型,如果将$c的值改为'eee123fff',那么输出$d的结果为4,这里可以说明,如果一个字符串和一个整型或浮点型数据进行运算,那么如果这个字符串的开头是数值型字符串,那么php解析器会把开头部分的数值截取出来(如果$c='12.5fff',那么会截取出12.5而不是12)和整型或者浮点型数据进行运算,结果为浮点型那么$d的类型就是浮点型,如果结果为整型那么$d的数据类型就是整形。如果这个字符串的开头不是数值型字符而是类似于eee123abc这样的字符串,虽然其中包含了数值型的字符,他也仍然是无法直接参与计算的,这种字符串会被转换成0。那么此时的$d = $a + $c,就相当于$d = $a + 0;
总结:
如果是字符串和数字进行基本运算,那么会先把字符串转换成数字,如果无法转换成数字,那么就把字符串当做0
如果是字符串和字符串进行基本运算,那么会尝试把两个字符串都转换成数字,如果有一个能转换成数字,那么结果就是这个数字,如果两个都不能转成数字,那么两个当做0,因此结果也就为0了。
强制转换
强制转换的方法有三种
-
settype(变量名,'类型')
类型可以是
int
integer
float
bool
boolean
string
array
object
,类型需要用单引号引起来,这一种是直接对变量本身修改 -
(类型)变量
类型可以是
int
integer
float
bool
boolean
string
array
object
,不对变量本身修改,而是返回新的值 intval(变量) floatval(变量) strval(变量) boolval(变量), 不对变量本身或者值修改,而是返回新的值
如何知道一个变量是什么数据类型?
答: 用函数gettype(变量名)即可获取该变量的类型。
上一篇: 一些安全相关的HTTP header
下一篇: Python学习手册之函数和模块