PHP数据类型

2018-11-05 08:24:38来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

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。

一些函数如 call_user_func() 或 usort() 可以接受用户自定义的回调函数作为参数。回调函数不止可以是简单函数,还可以是对象的方法,包括静态类方法。

基本数据类型的转换

自动转换

自动转换是由低到高的,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(变量名)即可获取该变量的类型。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:PHP变量

下一篇:Php中的goto用法