欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PHP数据类型

程序员文章站 2022-12-22 22:30:37
PHP 支持 9 种原始数据类型。详细讲述了其中基本数据类型的用法与注意事项。 ......

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。

要指定一个布尔值,使用常量 truefalse。两个都不区分大小写。

布尔型通常用于条件判断。

以下值在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(变量名)即可获取该变量的类型。