PHP 数据类型简介
PHP 支持 8 种原始数据类型。
四种标量类型:
- boolean(布尔型)
- integer(整型)
- float(浮点型,也称作 double)
- string(字符串)
两种复合类型:
- array(数组)
- object(对象)
最后是两种特殊类型:
- resource(资源)
- NULL(无类型)
类型检测
var_dump() 函数可以查看表达式的值和类型
gettype() 函数用于检测变量类型
is_ 加类型,如 is_int(),is_array() 等,判断变量是否为该类型
创建 test.php,并编辑内容
<?php
$a = TRUE;
$b = 'foo';
$c = 0.1;
$d = 12;
if(is_string($b)) {
echo nl2br("$b 是字符串".PHP_EOL);
}
if(is_int($c)) {
echo nl2br("$c 是整型".PHP_EOL);
}
var_dump($a);
echo '<br/>';
var_dump($b);
echo '<br/>';
echo gettype($c).PHP_EOL;
echo '<br/>';
echo gettype($d);
结果输出
foo 是字符串
bool(true)
string(3) "foo"
double integer
Boolean 布尔类型
布尔类型表达了真值,可以为 TRUE 或 FALSE,不区分大小写。
<?php
$a = True;
$b = False;
var_dump($a);// bool(true)
var_dump($b);// bool(false)
运算返回 boolean 类型的结果:
// == 是一个操作符,它检测两个变量值是否相等,并返回一个布尔值
注意当下列情况转换为 Boolean 时,其值为 FALSE
- 布尔值 FALSE 本身
- 整型值 0(零)
- 浮点型值 0.0(零)
- 空字符串,以及字符串 "0"
- 不包括任何元素的数组(但是空数组和空字符串或整型零不等)
- 特殊类型 NULL(包括尚未赋值的变量)
- 从空标记生成的 SimpleXML 对象
Integer 整型
整型值可以使用十进制,十六进制,八进制或二进制表示,前面可以加上可选的符号(- 或者 +)。
注意:要使用八进制表达,数字前必须加上 0。要使用十六进制表达,数字前必须加上 0x。要使用二进制表达,数字前必须加上 0b。
<?php
$a = 1234; // 十进制数
$b = -123; // 负数
$c = 0123; // 八进制数 (等于十进制 83)
$d = 0x1A; // 十六进制数 (等于十进制 26)
整数溢出
如果给定的一个数超出了 integer 的范围,将会被解释为 float。同样如果执行的运算结果超出了 integer 范围,也会返回 float。
<?php
$a = 123445566;
$b = 9223372036854775807;
$c = 9223372036854775808;
$d = 50000000000000 * 1000000;
var_dump($a);
var_dump($b);
var_dump($c);
var_dump($d);
Float 浮点型
浮点型(也叫浮点数 float,双精度数 double 或实数 real)
<?php
$a = 1.234;
$b = 1.2e3;
$c = 7E-10;
浮点数的字长和平台相关,通常最大值是 1.8e308 并具有 14 位十进制数字的精度(64 位 IEEE 格式)
String 字符串类型
一个字符串 string 就是由一系列的字符组成,其中每个字符等同于一个字节,PHP 中有 4 中表达方式
- 单引号
单引号内特殊字符和变量不会被解析
<?php
$a = 'Hello';
echo '$a \n World';//$a \n World
- 双引号
双引号内的特殊字符和变量会被解析。
<?php
$a = 'Hello';
/**
* Hello
* World
*/
echo "$a \n World";
- Heredoc
Heredoc 类似与双引号,内部转义字符和变量可以被解析,句法结构为
<<<EOT
字符串
EOT;
其中 EOT
为标识符,可以自定义,但是首尾标识符必须相同。开始标识符 EOT
后需换行,结束标识符 EOT
必须独占一行,且前面不许有空格。
<?php
$a ='Hello' ;
echo <<<EOT
$a Hello
EOT;
- Nowdoc
Nowdoc 类似于单引号,无法解析转义字符和变量。句法结构类似 Heredoc,但是需要在开始标识符加上单引号。
<?php
$a ='Hello' ;
echo <<<'EOT'//和 Heredoc 不同点
$a Hello
EOD;
Array 数组
数组实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。由于数组元素的值也可以是另一个数组,树形结构和多维数组也是允许的。
语法
定义数组可以用 array()
或 []
来新建一个数组。它接受任意数量用逗号分隔的键(key) => 值(value)对。key 可以是 integer(索引数组)或者 string(关联数组),value 可以是任意类型,如对象、数组。
<?php
$a = [
"b" => "bb",
"c" => "cc",
];
$b = [
"bb",
"cc"
];
$c = [
"bb",
"cc",
"a" => $a,
"b" => $b,
];
var_dump($a);
var_dump($a[0]);
var_dump($b);
var_dump($b['b']);
var_dump($c['a']['b']);
从结果中可以看到
- 如果没有键名,则数组默认使用从 0 开始的数字键名
- 打印数组不存在的 key 的值时,直接返回 NULL
- 数组可以多维嵌套,通过键名可以获取特定值
Object 对象
使用 new
可以创建一个新的对象
<?php
class foo
{
function do()
{
echo "Action do";
}
}
$f = new foo;
$f->do();
转换为对象
如果将一个对象转换成对象,它将不会有任何变化。如果其它任何类型的值被转换成对象,将会创建一个内置类 stdClass 的实例。如果该值为 NULL,则新的实例为空。 array 转换成 object 将使键名成为属性名并具有相对应的值,除了数字键,不迭代就无法被访问。
<?php
class A
{
}
$a = new A();
$b = (object)$a;
$c = (object)'A';
$d = (object)NULL;
$e = (object)['hello'=>'world'];
var_dump($a);
var_dump($b);
var_dump($c->scalar);
var_dump($d);
var_dump($e->hello);
从结果中可以看出
- $a 是对象,转换为对象后不发生变化,所以 $a 等于 $b
- 字符串 "A" 转换为对象时,自动生成 scalar 属性
- 数组 ['hello'=>'world'] 转换为对象时,键名 hello 作为属性,键值 world 为属性值
Resource 资源
资源 resource 是一种特殊变量,保存了外部资源的一个引用,如打开文件、数据库连接等,资源是通过专门的函数来建立和使用的
<?php
$file = fopen($filename);//打开文件
$db = mysqli_connect();//数据库连接
转换为资源
由于资源类型变量保存有为打开文件、数据库连接、图形画布区域等的特殊句柄,因此将其它类型的值转换为资源没有意义。
释放资源
引用计数系统是 Zend 引擎的一部分,可以自动检测到一个资源不再被引用了(和 Java 一样)。这种情况下此资源使用的所有外部资源都会被垃圾回收系统释放。因此,很少需要手工释放内存。
NULL
特殊的 NULL 值表示一个变量没有值。NULL 类型唯一可能的值就是 NULL。 在下列情况下一个变量被认为是 NULL:
- 被赋值为 NULL
- 尚未被赋值
- 被 unset()
语法
NULL 类型只有一个值,就是不区分大小写的常量 NULL。
<?php
$a = NULL;
转换到 NULL
使用 (unset) 将一个变量转换为 null 将不会删除该变量或 unset 其值。仅是返回 NULL 值而已
类型转换
PHP 是弱语言类型,定义变量的时候不需要制定变量类型,根据上下文自动解析成对于的变量类型。
<?php
$foo = "0";
var_dump($foo);
$foo += 2;
var_dump($foo);
$foo = $foo + 1.3;
var_dump($foo);
$foo = 5 + "10 Little Piggies";
var_dump($foo);
$foo = 5 + "10 Small Pigs";
var_dump($foo);
从结果中可以看出,PHP隐式转换的优先级为:浮点型 > 整型 > 字符串
类型强制转换
在要转换的变量之前加上用括号括起来的目标类型,如
<?php
$foo = 10; // $foo 是整数
$bar = (boolean) $foo; // 转换成布尔类型
允许的强制转换有:
- (int), (integer) - 转换为整形 integer
- (bool), (boolean) - 转换为布尔类型 boolean
- (float), (double), (real) - 转换为浮点型 float
- (string) - 转换为字符串 string
- (array) - 转换为数组 array
- (object) - 转换为对象 object
- (unset) - 转换为 NULL (PHP 5)