php有九种原始数据类型如下:
标量类型:boolean,integer,float,string
复合类型:array,object,callable
特殊类型:resource,null(无类型)
boolean(布尔值)
- 用TRUE/FALSE(不分大小写)指定布尔值即可,运算符返回的bool会被传递给控制流程
- 用双等号来判断布尔值变量真假是多余的
- 除多数情况使用其他值来当作bool参数可以自动转换外,还可以使用'(bool)','(boolean)'来进行强制转换
- 其中除了'false','int 0','float 0.0','''(空字符串)',''0'(字符串0)',空数组,null,未赋值的变量,空标记生成的simpleXML对象,非0值(不论正负)其他都是true,包括任何资源和NAN
- 条件“0 == ‘string’”是true,“0 === ‘string’”是false
integer
integer是整数集中的某个数,可以使用十进制,(0x)十六进制,(0)八进制和(0b)二进制表示,数字前符号可选
- 整数溢出后,32位系统会返回此数为float,64位会转成科学计数法表达的数字
- 当必须强制转换成integer时可用’(int)’,’(integer)'或intval()来转换
- 布尔值转换时false->0,true->1
- 浮点数向下取整,超出范围后会返回未定义
- php7.0.0起,NaN和Infinity转换成int时会变成0
浮点型(也叫浮点数 float,双精度数 double 或实数 real)
- 可用直接赋值或科学计数法方式定义
- 字长和平台有关
- 比较两个精度较大的浮点数需要通过迂回的方式来判断,除了使用任意精度函数和gmp函数外,还可以使用一个紧比该数值大一点的最小误差值(又称机器极小值或最小单元取整数),示例如下:
$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001;
if(abs($a-$b) < $epsilon) {
echo "true";
}
- 浮点数计算获得的无法定义或无法表述的值用NaN表示,因为不代表任何值,所以拿来比较是不合适的,包括与自身比较,相关函数is_nan()
string
- 一个字符串 string 就是由一系列的字符组成,其中每个字符等同于一个字节。这意味着 PHP 只能支持 256 的字符集,因此不支持 Unicode
- 四种表达方式:单引号(不可转义),双引号(可转义),heredoc语法结构(<<<标识符 换行 字符串内容 标识符,结束时的标识符必须在该行第一列且与之同行的只能有一个紧跟其后的分号,标识符由字符,数字,下划线构成,首字母为字符或下划线),nowdoc语法结构(>PHP5.3.0,除起始标识符需用单引号,不解析文本外,其他规则与heredoc类似)
- 可转义的字符:换行,回车,制表符,特殊字符或以不同进制表示的字符等
- 解析时遇见$符号会去组合尽量多的标识以形成一个合法的变量名,可以用花括号来明确变量名的界线,’]‘是数组索引的结束边界
- 转换字符串:true转成1,false转称空字符串,int和float转成字面样式的string,包括float的指数
Array
- PHP 中的数组实际上是一个有序映射(key=>value),因此可以将数组当成列表,散列表,字典,集合,栈,队列等等来使用,同样支持多维数组
- 数组定义可以指定key(int/string)=>value(任意类型),也可以直接将元素放在数组里
- key的强制类型转换:合法整形值->十进制,浮点数->舍小数点,布尔值->0,1,null->空字符串,数组和对象不可以为key
- 相同key赋值,后者会覆盖前者,未指定key则新值键名是之前使用过最大int键名+1作为新键名
- 方括号和花括号方式可通过key来访问数组单元
- 数组比较有array_diff()和数组运算符:联合(+),相等(=*2),全等(=*3),不等(!=/<>),不全等(!==)
- 转换为数组:任意 integer,float,string,boolean 和 resource 类型转换将得到一个仅有一个元素的数组,其下标为 0,该元素即为此标量的值。即(array)
s
c
a
l
a
r
V
a
l
u
e
与
a
r
r
a
y
(
scalarValue 与 array(
scalarValue与array(scalarValue) 完全一样。
如果一个 object 类型转换为 array,则结果为一个数组,其单元为该对象的属性。键名将为成员变量名,不过有几点例外:整数属性不可访问;私有变量前会加上类名作前缀;保护变量前会加上一个 ‘*’ 做前缀。这些前缀的前后都各有一个 NULL 字符。
object
- new 语句生成对象
- 如果将一个对象转换成对象,它将不会有任何变化。如果其它任何类型的值被转换成对象,将会创建一个内置类 stdClass 的实例。如果该值为 NULL,则新的实例为空。 array 转换成 object 将使键名成为属性名并具有相对应的值
resource
- 资源 resource 是一种特殊变量,保存了到外部资源的一个引用。资源是通过专门的函数来建立和使用的
- 由于资源类型变量保存有为打开文件、数据库连接、图形画布区域等的特殊句柄,因此将其它类型的值转换为资源没有意义
- 引用计数系统是 Zend 引擎的一部分,可以自动检测到一个资源不再被引用了(和 Java 一样)。这种情况下此资源使用的所有外部资源都会被垃圾回收系统释放。因此,很少需要手工释放内存
NULL
- 特殊的 NULL 值表示一个变量没有值。NULL 类型唯一可能的值就是 NULL
- 被赋值为null,尚未赋值,unset()过都认为是null
callback/callback类型(>PHP 5.4)
- 一些函数如 call_user_func() 或 usort() 可以接受用户自定义的回调函数作为参数。回调函数不止可以是简单函数,还可以是对象的方法,包括静态类方法。
- PHP是将函数以string形式传递的。 可以使用任何内置或用户自定义函数,但除了语言结构例如:array(),echo,empty(),eval(),exit(),isset(),list(),print 或 unset()。
- 一个已实例化的 object 的方法被作为 array 传递,下标 0 包含该 object,下标 1 包含方法名。 在同一个类里可以访问 protected 和 private 方法。
- 静态类方法也可不经实例化该类的对象而传递,只要在下标 0 中包含类名而不是对象。自 PHP 5.2.3 起,也可以传递 ‘ClassName::methodName’。
- 除了普通的用户自定义函数外,也可传递 匿名函数 给回调参数。