PHP 数据类型3
PHP 数据类型
PHP 数据类型
PHP 支持八种原始类型(type)。
四种标量类型:
string(字符串)
integer(整型)
float(浮点型,也作 double )
boolean(布尔型)
两种复合类型:
array(数组)
object(对象)
两种特殊类型:
resource(资源)
NULL(空)
查看变量类型
通过 gettype() 函数可以方便的查看某个变量的类型:
<?php
$var_bool = TRUE; // a boolean
$var_str = "foo"; // a string
$var_int = 12; // an integer
echo gettype($var_bool); // 输出 boolean
echo gettype($var_str); // 输出 string
echo gettype($var_int); // 输出 integer
?>
提示
由于历史原因,如果是 float 类型数据,gettype() 函数返回的是 double,而不是 float 。
如果想查看某个表达式的值和类型,请使用用 var_dump() 函数。
判断变量类型
如果想通过判断变量类型来确定下一步逻辑动作,不要使用 gettype() ,而使用 is_type 系列函数:
<?php
$var_int = 12;
// 如果 $var_int 是 int 类型,这进行加法
if (is_int($var_int)) {
$var_int = $var_int+4;
}
echo $var_int; // 输出 16
?>
如果要将一个变量强制转换为某类型,请参阅《PHP 数据类型转换》。
PHP 数据类型 - 字符串(string)类型
字符串类型
定义字符串类型例子:
$var_char = "你好!";
在该例子中,我们定义了一个字符串:你好! ,并把这个字符串赋值给变量 $var_char ,那么该变量也自动被定义为字符串(string)类型。
定义字符串有 3 种方法:
单引号(')
双引号(")
定界符(<<<)
单引号定义
将字符串用单引号(')括起来是定义字符串最简单的方法:
<?php
$var_char = '这是一些字符串';
?>
如果字符串中有单引号,那么需要使用反斜线()进行转义:
<?php
$var_char = '字符串中包含'需要转义';
echo $var_char; //输出:字符串中包含'需要转义
?>
提示:如果在单引号之前或字符串结尾需要出现一个反斜线,需要用两个反斜线表示。换言之反斜线在此只转义 ' 字符而不会转义其他字符。
如果只是定义一个简单的字符串而不需要解析更多的内容,显然用单引号效率更高。
双引号定义
如果用双引号(")定义字符串,PHP 懂得更多特殊字符的转义序列:
转义序列 说明
\n 换行
\r 回车
\t 水平制表符
\[/td> 反斜线
\$ 美元符号
\" 双引号
\[0-7]{1,3} 此正则表达式序列匹配一个用八进制符号表示的字符
\x[0-9A-Fa-f]{1,2} 此正则表达式序列匹配一个用十六进制符号表示的字符
例子:
<?php
$var_char = "这里有个换行\n这是第二行文字";
?>
运行该例子,查看网页源代码显示:
这里有个换行
这是第二行文字
注意该例子中的换行是指文本意义上换行,如果需要在浏览器里显示换行,需要用 nl2br() 函数将 \n 替换成 <br />。
双引号字符串最重要的一点是其中的变量名会被变量值解析替代:
<?php
$var_char = "这是一些文字";
echo "请打印这些文字:$var_char"; //输出:请打印这些文字:这是一些文字
?>
定界符定义
定界符定义字符串是使用定界符语法(<<<),并在定界符之后提供一个标识符,然后是被定义的字符串,最后是同样的标识符结束字符串定义。
例子:
<?php
$str = <<<EOD
我是用定界符定义字符串的例子
这是其他更多字符
……
EOD;
?>
该例子中,EOD 就是标识符。结束标识符必须从行的第一列开始。同样,标识符也必须遵循 PHP 中其它任何标签的命名规则:只能包含字母数字下划线,而且必须以下划线或非数字字符开始。
注意:结束标识符所在的行不能有任何其他字符(可能除了一个分号 ; 之外),包括行缩进等。
提示
字符串不仅仅指上面例子所示的若干文字字符,也可以把数字定义为字符串,甚至巨大的长文本,这是和数据库中的 char 定义不一样的地方。
PHP 数据类型 - 整型(integer)
整型
整型是指 {..., -2, -1, 0, 1, 2, ...} 集合中的一个数。
定义整型的例子:
$var_int = 12345;
整型值可以用十进制,十六进制或八进制符号指定,如果用八进制符号,数字前必须加上 0(零),用十六进制符号数字前必须加上 0x:
$var_int = 0123; // 八进制数(等于十进制的 83)
$var_int2 = 0x1A; // 十六进制数(等于十进制的 26)
提示:整型数据不需要单引号或双引号,否则会被当作字符串类型来定义。
整数溢出
如果给定的一个数超出了 integer 的范围,将会被解释为 float类型 。同样如果执行的运算结果超出了 integer 范围,也会返回 float。
整型数的范围和平台有关,通常最大值是大约二十亿(32 位有符号)。
PHP 数据类型 - 浮点型(float or double)
浮点型
浮点型几乎可以定义任意的数字。
定义浮点型的例子:
$float_num = 12.11;
浮点数的字长和平台相关,尽管通常最大值是 1.8e308 并具有 14 位十进制数字的精度(64 位 IEEE 格式)。
PHP 数据类型 - 布尔型(boolean)
布尔型
布尔类型分为两类:
TRUE:表示事实成立,为真,也可写作true
FALSE:表示事实不成立,为假,也可写作false
例如将两个数字作比较( == 为比较运算符,参见《PHP 运算符》):
<?php
$num1 = 2;
$num2 = 5;
if($num1 == $num2){
echo '$num1 等于 $num2';
} else {
echo '$num1 不等于 $num2';
}
?>
运行该例子,浏览器输出:
$num1 不等于 $num2
对于 $num1 == $num2 的比较结果 FALSE 是一个逻辑结果,而不能直接调用 echo 等指令输出 FALSE ,而应该用流程控制来获取。关于流程控制参见《PHP 流程控制》。
转换为布尔值
很多情况下我们需要对值进行布尔判断,大部分情况下不需要用强制转换,因为当运算符、函数或者流程控制需要一个 boolean 参数时,该值会被自动转换。
当其他类型转换为 boolean 时,以下值被认为是 FALSE :
整型值 0(零)
浮点型值 0.0(零)
空白字符串和字符串 "0"
没有成员变量的数组
没有单元的对象(仅适用于 PHP 4)
特殊类型 NULL(包括尚未设定的变量)
除上所列意外的所有其它值都被认为是 TRUE(包括任何资源)。
PHP 数据类型 - 数组(array)
数组
数组是 PHP 中被经常使用的数据类型,可以用 array() 语言结构来新建一个数组:
$arr = array("foo" => "bar", 12 => TRUE);
echo $arr<"foo">; //输出:bar
echo $arr<12>; //输出:1
例子中,"foo" 与 12 称为键名(key),"bar" 与 TRUE 为对应的值。数组实体都包含键名和值两项。
在这个数组里,包含了2个类型:
$arr["foo"]:值为 "bar" ,字符串类型
$arr[12]:值为TRUE ,布尔型
提示
应该始终在用字符串表示的键名加上引号。例如用 $arr<'bar'> 或 $arr<"bar"> 而不是 $arr。
关于 PHP 数组更详细的介绍参见《PHP 数组》。
PHP 数据类型 - 对象(object)
对象
使用 new 关键字实例化一个对象:
<?php
//定义一个类
class foo {
function do_foo() {
echo "你好!";
}
}
$bar = new foo; //实例化一个对象
$bar->do_foo(); //执行do_foo,输出“你好!”
?>
关于 PHP 类及对象更详细的介绍参见《PHP 类与对象》。
PHP 数据类型 - 资源(resource)
资源
资源是一种特殊的变量类型,保存了到外部资源的一个引用:如打开文件、数据库连接、图形画布区域等。
资源是通过专门的函数来建立和使用的。
例子:
<?php
if(!file_exists("test.txt")){
$fh = fopen("test.txt","w"); //打开文件
echo get_resource_type($fh); // 输出:stream
fclose($fh); //关闭文件
}
?>
转换为资源
由于资源类型变量保存有为打开文件、数据库连接、图形画布区域等的特殊句柄,因此无法将其它类型的值转换为资源。
释放资源
由于 PHP4 Zend 引擎引进了资源计数系统,可以自动检测到一个资源不再被引用了(和 Java 一样)。这种情况下此资源使用的所有外部资源都会被垃圾回收系统释放。因此,很少需要用某些 free-result 函数来手工释放内存。
注意: 持久数据库连接比较特殊,它们不会被垃圾回收系统破坏。具体可参见《MySQL 数据库连接》。
PHP 数据类型 - NULL
NULL
特殊的 NULL 值表示一个变量没有值,NULL 类型唯一可能的值就是 NULL。
在下列情况下一个变量被认为是 NULL:
被赋值为 NULL
尚未被赋值
被 unset()
提示
NULL不可写作null。
is_null()
is_null() 函数检测变量是否为 NULL ,如果变量是 NULL 则返回 TRUE,否则返回 FALSE。
<?php
$var = NULL;
if(is_null($var)){
echo '$var 为 NULL';
} else {
echo '$var 变量非 NULL';
}
?>
运行该例子,浏览器输出:
$var 变量为 NULL
PHP 数据类型转换
类型强制转换
PHP 中的类型强制转换和 C 中的非常像:在要转换的变量之前加上用括号括起来的目标类型:
<?php
$foo = 10; // $foo 为整型
$bar = (boolean) $foo; // $bar 为布尔型
?>
允许的强制转换有:
(int)或(integer) - 转换成整型
(bool)或(boolean) - 转换成布尔型
(float)或(double)或(real) - 转换成浮点型
(string) - 转换成字符串
(array) - 转换成数组
(object) - 转换成对象
另外,将一个变量还原为字符串,还可以将变量放置在双引号中:
<?php
$foo = 10; // $foo 为整型
$str = "$foo"; // $str 为字符串
?>
类型戏法
PHP 在变量定义中不需要(或不支持)明示的类型定义,变量类型是根据使用该变量的上下文所决定的:
<?php
$foo = "0"; // $foo 为字符型
$foo = $foo+2; // $foo 现在为整型,值为2
$foo = $foo + 1.3; // $foo 为浮点型:3.3
$foo2 = 5 + "10 Little Piggies"; // $foo2 为整型,参考下面 延伸阅读 部分
?>
延伸阅读
当一个字符串被当作数字来求值时,根据以下规则来决定结果的类型和值:
如果包括“.”,“e”或“E”其中任何一个字符的话,字符串被当作 float 来求值,否则就被当作整数
该值由字符串最前面的部分决定。如果字符串以合法的数字数据开始,就用该数字作为其值,否则其值为 0(零)。合法数字数据由可选的正负号开始,后面跟着一个或多个数字(可选地包括十进制分数),后面跟着可选的指数。指数是一个“e”或者“E”后面跟着一个或多个数字
例子:
<?php
$foo = 1 + "10.5"; // $foo为浮点型:11.5
$foo = 1 + "-1.3e3"; // $foo 为浮点型:-1299
$foo = 1 + "bob-1.3e3"; // $foo 为整型:1
$foo = 1 + "bob3"; // $foo为整型:1
$foo = 1 + "10 Small Pigs"; // $foo为整型:11
$foo = "10.0 pigs " + 1; // $foo 为浮点型:11
?>
提示
前面说过,PHP是一门松散类型的语言,不必对使用的变量做专门的定义,这给程序的编写带来很大的灵活与方便。但我们在程序编写过程中,需要知道自己使用的变量是哪种类型的,因为变量始终有一种类型与之对应。尽管各类型之间几乎可以做自由的转换,如果随意使用或者转化变量类型,可能导致一些潜在的错误。