前言
PHP 支持 10 种原始数据类型。
四种标量类型:
- bool - 布尔型
- int - 整形
- float - 浮点型 (也称 double、双精度)
- string - 字符串
四种复合类型:
- array - 数组 (本人认为是PHP最强大之处)
- object - 对象
- callable - 可调用
- iterable - 可迭代
两种特殊类型:
- resource - 资源
- null - 空
数据类型
【1】、boolean - 布尔类型
取值范围
仅可取值范围为:true、false。
注意
需要注意的是值转换成 boolean 时候,部分值是被转化为 false, 其余的都为 true。以下情况在发生类型转化时候会被转化为 false :
- 布尔值 false 本身。
- 整型值 0(零)及 -0 (零)。
- 浮点型值 0.0(零)-0.0(零)。
- 空字符串,以及字符串 “0”。
- 不包括任何元素的数组。
- 特殊类型 NULL(包括尚未赋值的变量)。
- 从空标记生成的 SimpleXML 对象。
【2】、integer - 整型
取值范围
int 是集合 ℤ = {…, -2, -1, 0, 1, 2, …} 中的某个数。
PHP 不支持无符号的 int。int 值的字长可以用常量 PHP_INT_SIZE来表示, 最大值可以用常量 PHP_INT_MAX 来表示, 最小值可以用常量 PHP_INT_MIN 表示。
进制表示
整型值 int 可以使用十进制,十六进制,八进制或二进制表示:
- 八进制表达,数字前必须加上 0。
- 十六进制表达,数字前必须加上 0x。
- 二进制表达,数字前必须加上 0b。
整数溢出
整型数 int 的字长和平台有关,在 32 位操作系统为 2^31 位有符号; 在 64 位操作系统为 2^63 位有符号。
但如果给定的一个数超出了 int 的范围,将会被解释为 float。同样如果执行的运算结果超出了 int 范围,也会返回 float。
转换为整型
1)从布尔值转换 。
- false 为 0,true 为 1。
2)从浮点型转换。
- 向下取整。
3)从字符串转换 。
- 如果字符串是数字或前导数字,则它将解析为相应的整数值,否则将转换为 0。
4)从 NULL 转换。
- 恒为 0。
【3】、Float - 浮点型
解释
浮点型(也叫浮点数 float,双精度数 double 或实数 real)
精度
PHP 通常使用 IEEE 754 双精度格式,则由于取整而导致的最大相对误差为 1.11e-16。非基本数学运算可能会给出更大误差,并且要考虑到进行复合运算时的误差传递。
*不要比较两个浮点数是否相等,可能不是你期待的结果。
【4】、String - 字符串
解释
string 就是由一系列的字符组成,其中每个字符等同于一个字节。这意味着 PHP 只能支持 256 的字符集,因此不支持 Unicode 。
可以理解为PHP一个字节数组,所以可以使用下标去获取元素。字符串类型的此特性解释了为什么 PHP 中没有单独的“byte”类型 - 已经用字符串来代替了。
总所周知 PHP 是使用 C 语言实现的, C 语言并不是二进制安全的。但是 PHP 却是二进制安全的,这是因为 PHP 的字符串结构体是这样的。
struct{
char *val;
int len; en表示该字符串的长度,无论是否遇到“\0”字符,都按照len长度读取该字符串。
} str;
这里和 Redis 的 SDS 有着异曲同工之处,可以看这篇博文 《SDS - 简单动态字符串》。
**语法 **
一个字符串可以用 4 种方式表达:
-
单引号
单引号字符串中的变量和特殊字符的转义序列将不会被替换。
-
双引号
用双引号定义的字符串最重要的特征是变量会被解析。
-
heredoc 语法结构 ,作用类似于双引号字符串。
用 heredoc 句法结构:<<<。在该运算符之后要提供一个标识符,然后换行。接下来是字符串 string 本身,最后要用前面定义的标识符作为结束标志。
结束时所引用的标识符必须在该行的第一列,而且,标识符的命名也要像其它标签一样遵守 PHP 的规则:只能包含字母、数字和下划线,并且必须以字母和下划线作为开头。
-
nowdoc 语法结构,作用类似于单引号字符串的。
Nowdoc 结构很象 heredoc 结构,但是 nowdoc 中不进行解析操作。这种结构很适合用于嵌入 PHP 代码或其它大段文本而无需对其中的特殊字符进行转义。
一个 nowdoc 结构也用和 heredocs 结构一样的标记 <<<, 但是跟在后面的标识符要用单引号括起来,即 <<<‘EOT’。
【5】、Array - 数组
解释
PHP 最强大之处,我理解就是Array。不同也其他的语言有数据、切片、list、map,在 PHP 中 Array就能实现这些数据结构的功能,当然带来的弊端就是 PHP 的数组很占内存。所谓是成也萧何、败也萧何。
PHP 中的数组实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合,栈,队列以及更多可能性。
语法
可使用 array() 或者 [],声明一个数组。
类型
分为两种类型:索引数组和关联数组。
- key 可以是 integer 或者 string。value 可以是任意类型。
- 对于同一个键名,后者覆盖前者。
- 可混合 integer 和 string 键名。
- key 为可选项。如果未指定,PHP 将自动使用之前用过的最大 integer 键名加上 1 作为新的键名。
遍历
- 遍历数组的顺序, 是和元素的添加先后相关的。
- 按顺序遍历索引数组应该使用for, 而不是foreach。
【6】、Iterable - 可迭代对象
解释
Iterable是 PHP 7.1 中引入的一个伪类型。它接受任何 array 或实现了 Traversable 接口的对象。这些类型都能用 foreach 迭代, 也可以和 生成器 里的 yield from 一起使用。
语法
iterable $iterable。
用法
- 迭代对象还可以用作返回类型,表示函数将返回一个可迭代的值。 如果返回值不是数组或 Traversable 的实例,则会抛出一个 TypeError。
- 声明为可迭代的参数可能会使用 null 或者一个数组作为默认值。
【7】、Object - 对象
初始化
- 建一个新的对象 object,需使用 new 语句实例化一个类。
- new \stdClass。
【8】、Resource - 资源类型
解释
资源 resource 是一种特殊变量,保存了到外部资源的一个引用。资源是通过专门的函数来建立和使用的。比如:curl、fopen等等。
注意
由于资源类型变量保存有为打开文件、数据库连接、图形画布区域等的特殊句柄,因此将其它类型的值转换为资源没有意义。
【9】、NULL
解释
特殊的 null 值表示一个变量没有值。NULL 类型唯一可能的值就是 null。 null 类型只有一个值,就是不区分大小写的常量 null。
以下情况为 null :
- 被赋值为 null。
- 尚未被赋值。
- 被 unset()。
【10】、Callback / Callable - 类型
解释
HP 5.4 起可用 callable 类型指定回调类型 callback。一些函数如 call_user_func() 或 usort() 可以接受用户自定义的回调函数作为参数。
传递
PHP 是将函数以string形式传递的。 可以使用任何内置或用户自定义函数,但除了语言结构例如:array(),echo,empty(),eval(),exit(),isset(),list(),print 或 unset()。
举例
1)、回调函数示例
<?php
=function my_callback_function() {
echo 'hello world!';
}
// 一个示例回调方法
class MyClass {
static function myCallbackMethod() {
echo 'Hello World!';
}
}
// 简单回调
call_user_func('my_callback_function');
// 静态类方法调用
call_user_func(array('MyClass', 'myCallbackMethod'));
// 对象方法调用
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));
// 静态类方法调用 ( PHP 5.2.3 以后)
call_user_func('MyClass::myCallbackMethod');
// 相对静态类方法调用 (PHP 5.3.0 以后)
class A {
public static function who() {
echo "A\n";
}
}
class B extends A {
public static function who() {
echo "B\n";
}
}
call_user_func(array('B', 'parent::who')); // A
// 实现 __invoke 的对象可以用作可调用对象 ( PHP 5.3 以后)
class C {
public function __invoke($name) {
echo 'Hello ', $name, "\n";
}
}
$c = new C();
call_user_func($c, 'PHP!');
2)、使用 Closure 的示例。
<?php
$double = function($a) {
return $a * 2;
};
$numbers = range(1, 5);
$new_numbers = array_map($double, $numbers);
print implode(' ', $new_numbers);