概述
php 支持 8 种原始数据类型
四种标量类型:
boolean(布尔型)integer(整型)float(浮点型,也称作 double)string(字符串)
两种复合类型:
array(数组)object(对象)
最后是两种特殊类型:
resource(资源)null(无类型)
实际上 double 和 float 是相同的,由于一些历史的原因,这两个名称同时存在。
变量的类型通常不是由程序员设定的,确切地说,是由 php 根据该变量使用的上下文在运行时决定的。
检测变量类型 var_dump()打印变量的相关信息
gettype()获取变量的类型
string(1) a [1]=> string(1) b }var_dump($f); // object(foo)#1 (0) { }var_dump(fn); // string(2) fnecho '
';echo gettype($a); // booleanecho gettype($b); // integerecho gettype($c); // doubleecho gettype($d); // stringecho gettype($e); // arrayecho gettype($f); // objectecho gettype(fn); // string?>
不要使用 gettype() 来测试某种类型,因为其返回的字符串在未来的版本中可能需要改变。此外,由于包含了字符串的比较,它的运行也是较慢的。 使用 is_* 函数代替
is_bool()is_integer()is_float()is_numeric()is_string()is_scalar() is_array()is_object()is_resource()is_null()function_exists() // 函数是否存在method_exists() // 某对象的方法是否存在
boolean 布尔类型 true 和 false 不区分大小写
自动类型转换为布尔值 当自动类型转换为 boolean 时,以下值被认为是 false
布尔值 false 本身整型值 0(零)浮点型值 0.0(零)空字符串,以及字符串 0不包括任何元素的数组不包括任何成员变量的对象(仅 php 4.0 适用)特殊类型 null(包括尚未赋值的变量)从空标记生成的 simplexml 对象
integer 整型 要使用八进制表达,数字前必须加上 0(零)
要使用十六进制表达,数字前必须加上 0x
要使用二进制表达,数字前必须加上 0b
二进制表达的 integer 自 php 5.4.0 起可用
整型数的字长和平台有关,尽管通常最大值是大约二十亿(32 位有符号)。64 位平台下的最大值通常是大约 9e18
php 不支持无符号整数
integer 值的字长可以用常量php_int_size来表示,自 php 4.4.0 和 php 5.0.5后,最大值可以用常量php_int_max来表示
整数溢出 如果给定的一个数超出了 integer 的范围(即出现整数溢出),将会被解释为 float。同样如果执行的运算结果超出了 integer 范围,也会返回 float
自动类型转换为整型 从布尔值转换
false 将产生出 0(零),true 将产生出 1(壹)
从浮点型转换
当从浮点数转换成整数时,将向下取整。
从字符串转换
如果该字符串没有包含 ‘.’,’e’ 或 ‘e’ 并且其数字值在整型的范围之内(由 php_int_max 所定义),该字符串将被当成 integer 来取值。其它所有情况下都被作为 float 来取值。
float 浮点型 浮点数的字长和平台相关
以十进制能够精确表示的有理数如 0.1 或 0.7,无论有多少尾数都不能被内部所使用的二进制精确表示,因此不能在不丢失一点点精度的情况下转换为二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999999991118…
所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等
如果确实需要更高的精度,应该使用任意精度数学函数或者gmp函数。
nan 某些数学运算会产生一个由常量 nan 所代表的结果。此结果代表着一个在浮点数运算中未定义或不可表述的值
不应拿 nan 去和其它值进行比较,包括其自身,应该用is_nan()来检查
string 字符串 一个字符串可以用 4 种方式表达
单引号双引号heredoc 语法结构nowdoc 语法结构(自 php 5.3.0 起)
string 中的字符可以通过一个从 0 开始的下标,用类似 array 结构中的方括号包含对应的数字来访问和修改
heredoc、nowdoc heredoc 结构就象是没有使用双引号的双引号字符串
结束时所引用的标识符必须在该行的第一列,而且,标识符的命名也要像其它标签一样遵守 php 的规则:只能包含字母、数字和下划线,并且必须以字母和下划线作为开头。
$str = nowdoc 结构就象是没有使用单引号的单引号字符串
$str = 转义 如果字符串是包围在单引号(’)中,只能转义单引号(’)和反斜线(\)
如果字符串是包围在双引号(”)中, php 将对下面一些特殊的字符进行解析
序列 含义
\n 换行(ascii 字符集中的 lf 或 0x0a (10))
\r 回车(ascii 字符集中的 cr 或 0x0d (13))
\t 水平制表符(ascii 字符集中的 ht 或 0x09 (9))
\v 垂直制表符(ascii 字符集中的 vt 或 0x0b (11))(自 php 5.2.5 起)
\e escape(ascii 字符集中的 esc 或 0x1b (27))(自 php 5.4.0 起)
\f 换页(ascii 字符集中的 ff 或 0x0c (12))(自 php 5.2.5 起)
\\ 反斜线
\$ 美元标记
\” 双引号
\[0-7]{1,3} 符合该正则表达式序列的是一个以八进制方式来表达的字符
\x[0-9a-fa-f]{1,2} 符合该正则表达式序列的是一个以十六进制方式来表达的字符
和单引号字符串一样,转义任何其它字符都会导致反斜线被显示出来
花括号语法 由于 { 无法被转义,只有 $ 紧挨着 { 时才会被识别,不能有空格,且必须用双引号包围(不能用在双引号之外)
$x = 'hello';$y = 'world';$str = hi, {$x};// $str = 'hi, {$x}'; // 无效// $str = hi, {$x} . {$y}; // 无效
自动类型转换为字符串 一个布尔值 boolean 的 true 被转换成 string 的 “1”。boolean 的 false 被转换成 “”(空字符串)
一个整数 integer 或浮点数 float 被转换为数字的字面样式的 string(包括 float 中的指数部分)
数组 array 总是转换成字符串 “array”,因此,echo 和 print 无法显示出该数组的内容
object不能转换成字符串,自 php 5 起,适当时可以用 __tostring 方法
字符串函数 http://php.net/manual/zh/ref.strings.php
字符串的编码 字符串会被按照该脚本文件相同的编码方式来编码。操作文本的函数必须假定字符串是如何编码的,不幸的是,php 关于此的函数有很多变种
某些函数假定字符串是以单字节编码的,但并不需要将字节解释为特定的字符。例如 substr(),strpos(),strlen() 和 strcmp()。理解这些函数的另一种方法是它们作用于内存缓冲区,即按照字节和字节下标操作。
某些函数被传递入了字符串的编码方式,也可能会假定默认无此信息。例如 htmlentities() 和 mbstring 扩展中的大部分函数。
其它函数使用了当前区域(见 setlocale()),但是逐字节操作。例如 strcasecmp(),strtoupper() 和 ucfirst()。这意味着这些函数只能用于单字节编码,而且编码要与区域匹配。例如 strtoupper(“á”) 在区域设定正确并且 á 是单字节编码时会返回 “á”。如果是用 utf-8 编码则不会返回正确结果,其结果根据当前区域有可能返回损坏的值。
最后一些函数会假定字符串是使用某特定编码的,通常是 utf-8。intl 扩展和 pcre(上例中仅在使用了 u 修饰符时)扩展中的大部分函数都是这样。尽管这是由于其特殊用途,utf8_decode() 会假定 utf-8 编码而 utf8_encode() 会假定 iso-8859-1 编码。
要书写能够正确使用 unicode 的程序依赖于很小心地避免那些可能会损坏数据的函数,必要时使用mbstring扩展的多字节字符串函数。
resource 资源类型 资源 resource 是一种特殊变量,保存了到外部资源的一个引用,如打开文件、数据库连接、图形画布区域等的特殊句柄
由于 php 4 zend 引擎引进了引用计数系统,可以自动检测到一个资源不再被引用了(和 java 一样)。这种情况下此资源使用的所有外部资源都会被垃圾回收系统释放。因此,很少需要手工释放内存。
持久数据库连接比较特殊,它们不会被垃圾回收系统销毁。
将其它类型的值转换为资源没有意义。
null 特殊的 null 值表示一个变量没有值。null 类型只有一个值,就是不区分大小写的常量 null。
在下列情况下一个变量被认为是 null:
被赋值为 null。尚未被赋值。被 unset()。
强制类型转换 允许的强制转换有
(int), (integer) - 转换为整形 integer(bool), (boolean) - 转换为布尔类型 boolean(float), (double), (real) - 转换为浮点型 float(string) - 转换为字符串 string(array) - 转换为数组 array(object) - 转换为对象 object(unset) - 转换为 null (php 5)
使用settype()函数
// 可以设置的type类型如下“boolean” (或为“bool”,从 php 4.2.0 起)“integer” (或为“int”,从 php 4.2.0 起)“float” (只在 php 4.2.0 之后可以使用,对于旧版本中使用的“double”现已停用)stringarrayobject“null” (从 php 4.2.0 起)
还有一些类型转换的函数boolval()、intval()、floatval()、strval()
版权声明:本文为博主原创文章,未经博主允许不得转载。