PHP数据类型:四种标量类型、三种复合类型、两种特殊类型

2019年7月29日17:54:50 评论 413
摘要

PHP学习笔记:PHP数据类型。知识来源:《PHP从零基础到项目实战》——未来科技编著、PHP手册。

PHP数据类型:四种标量类型、三种复合类型、两种特殊类型

PHP支持9种数据类型,包括四种标量类型:boolean(布尔型)、integer(整型)、float(浮点型,也称为double,即双精度)、string(字符串);三种复合类型:array(数组)、object(对象)、callable(可调用);两种特殊类型:resource(资源)、NULL(无类型,即空值NULL)。

PS:PHP变量类型不需要声明,PHP变量类型是由 PHP 根据该变量使用的上下文在运行时决定的。

标量类型

(1)boolean(布尔型)

boolean(布尔型)是最简单的数据结构类型,仅包含了两个值,即True(真)和False(假),这里不区分大小写。当需要指定一个变量的值为布尔型时,直接将True或False关键字赋值给该变量即可。样例:

<?php 
$foo = True; //设置变量$foo的值为真。 
?>

示例:通常利用某些运算符返回布尔值来控制流程方向。样例:

<?php
if ($action == "show_version") {  //== 是一个操作符,用来检测两个变量是否相等并返回一个布尔值。
    echo "The version is 1.23";
}
?>

下面这种用法是没有必要的:

if ($show_separators == True) {
	echo "<hr>\n";
}

可以使用下面这种简单的方式表示:

if ($show_separators) {
    echo "<hr>\n";
}
(2)integer(整型)

整型数值就只包含我们中学学的整数,其表示方法可以为十进制、十六进制、八进制以及二进制。在前面可添加可选符号“-”或者“+”。

PS:八进制表示数字前必须加上 0(零),十六进制表示数字前必须加上 0x ,二进制表示数字前必须加上 0b 。
样例:

<?php
$a = 520;           //十进制数
$a = -250;          //负数
$a = 01010;         //八进制数(等于十进制 520)
$a = 0x208;         //十六进制数(等于十进制 520)
$a = 0b1000001000;  //二进制数(等于十进制 520)
?>

整型数的字长与平台有关,通常最大值约为二十亿(32位有符号)。64位平台下的最大值通常约为9E18,Windows下PHP7以前的版本字长总为32位。PHP不支持无符号的integer,integer值可使用PHP_INT_MAX来表示最大整数,用PHP_INT_MIN表示最小整数。

PS: PHP 7 以前的版本里,如果向八进制数传递了一个非法数字(即 8 或 9),则后面其余数字会被忽略。PHP 7 以后,会产生 Parse Error(解析错误)。
样例:

<?php
var_dump(01090);  //PHP7下抛出异常
?>
//PHP7之前版本执行结果为:int(8)
//PHP7版本执行结果为:Parse error: Invalid numeric literal in /usercode/file.php on line 2 

当给定的数超出整数范围时会被解释为浮点数。同样若执行运算结果超出整数范围时也会返回浮点数。以下样例为64位系统下的整数溢出情况:

<?php
$large_number = 2147483647;
var_dump($large_number);  //输出为 int(2147483647)
$million = 1000000;
$large_number = 50000000000000 * $million;
var_dump($large_number);  //输出为 float(5.0E+19)
?>
(3)float(浮点型)

浮点型(也叫浮点数 float,双精度数 double 或实数 real)可以用以下任一语法定义:

<?php
$a = 1.234;    //标注格式定义
$b = 1.2e3;    //科学计数法格式定义
$c = 7E-10;    //科学计数法格式定义
?>

浮点数的字长和平台相关,通常最大值是 1.8e308 并具有 14 位十进制数字的精度(64 位 IEEE 格式)。
注意:浮点型的数值只是一个近似值,应该避免使用浮点型数值进行大小比较,因为浮点数精确不到最后一位。若确实需要更高精度,应使用任意精度数学函数或者gmp函数。例如:floor((0.1+0.7)*10)通常会返回7而不是8。同样,十进制表达式1/3返回的值为0.3。
PS:NAN是一个特殊的浮点常数值,是某些数学运算所产生的的一个达标结果,它表示未定义或不可描述的值。由于 NAN 代表着任何不同值,故不应拿 NAN 去和其它值进行比较,包括其自身,只可用is_nan()函数来检查。

(4)string(字符串)

字符串是由一系列的字符组成,一个字符就是一个字节,这意味着 PHP 只能支持 256 的字符集,因此不支持 Unicode 。一个字符串可通过单引号、双引号、Heredoc语法结构和Nowdoc语法结构(PHP5.3.0以后)来表示。

  • 单引号

定义一个字符串的最简单的方法是用单引号把它包围起来(字符 ')。如果要输出一个单引号,则需要在它前面加一反斜杠(\)。在单引号前或字符串结尾处想要添加反斜杠时,则需要输入两个反斜杠(\\)。如果在其它任何字符前添加了反斜杠,则会被直接输出。样例:

<?php
echo '单行字符串';
echo '多行
字符串';
echo '"I\'ll be back"';                   //输出:"I'll be back"。
echo 'C:\\*.*?';                          //输出:C:\*.*?
echo 'You deleted C:\*.*?';               //输出:You deleted C:\*.*?
echo 'This will not expand:\n a newline'; //输出:This will not expand:\n a newline
echo 'Variables do not $expand $either';  //输出:Variables do not $expand $either
?>
  • 双引号

如果字符串是包围在双引号("")中, PHP 将对一些特殊的字符进行解析,这些字符都要通过转义符来显示。其表示如下表:

转义字符 意义 ASCII码值(十进制)
\a 响铃(BEL) 007
\b 退格(BS),将当前位置移到前一列 008
\f 换页(FF),将当前位置移到下页开头 012
\n 换行(LF),将当前位置换到下一行开头 010
\r 回车(CR),将当前位置移到本行开头 013
\t 水平制表(HT)(跳到下一个TAB位置) 009
\v 垂直制表(VT) 011
\\ 代表一个反斜杠字符“\” 092
\' 代表一个单引号字符 039
\" 代表一个双引号字符 034
\? 代表一个问号 063
\0 空字符(NULL) 000
\ddd 1到3位八进制数所代表的任意字符 三位八进制
\xhh 1到2位十六进制所代表的的任意字符 二位十六进制
  • Heredoc结构

第三种定义字符串的方法是使用heredoc语法结构:<<< 。在该提示符后需要定义一个标识符,然后换行,接卸来才是字符串本身,最后再用前面定义的标识符来作为结束标志。结束时所引用的标识符必须在该行的第一列,而且标识符的命名也要像其它标签一样遵守 PHP 的规则:只能包含字母、数字和下划线,并且必须以字母和下划线作为开头。样例:

<?php
$str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;
echo $str
?>
注意:结束标识符这行除了可能有一个分号(;)外,绝对不能包含其它字符。这意味着标识符不能缩进,分号的前后也不能有任何空白或制表符。更重要的是结束标识符的前面,必须有个被本地操作系统认可的换行,比如在 UNIX 和 Mac OS X 系统中是 \n,而结束标识符(可能其后有个分号)之后也必须紧跟一个换行。

Heredoc 结构就象是没有使用双引号的双引号字符串。在 heredoc 结构中单引号不用被转义,但是上文中列出的转义序列还可以使用。变量将被替换,在 heredoc 结构中含有复杂的变量时要格外小心。

  • Nowdoc 结构

就象 heredoc 结构类似于双引号字符串,Nowdoc 结构是类似于单引号字符串的。Nowdoc 结构很象 heredoc 结构,但是 nowdoc 中不进行解析操作。这种结构很适合用于嵌入 PHP 代码或其它大段文本而无需对其中的特殊字符进行转义。与 SGML 的 <![CDATA[ ]]> 结构是用来声明大段的不用解析的文本类似,nowdoc 结构也有相同的特征。nowdoc 结构用和 heredocs 结构一样的标记 <<<, 但是跟在后面的标识符要用单引号括起来,即 <<<'EOT'。Heredoc 结构的所有规则也同样适用于 nowdoc 结构,尤其是结束标识符的规则。样例:

<?php
$str = <<<'EOD'
Example of string
spanning multiple lines
using nowdoc syntax.
EOD;
?>

复合类型

(1)array(数组)

数组实际上是一个有序数据集合。在数组中,每个数据单元被称为元素,元素包括索引(键名)和值两部分。元素的索引可以是数字或字符串。值可以是任意数据类型。定义数组的方法有多钟,以下样例演示基本的四种定义方法:

<?php
//格式1:使用array()函数
$array = array(
    "foo" => "bar",
    "bar" => "foo",
);
格式2:没有键名的索引数组
$array = array("foo", "bar", "hallo", "world");
//格式3:数组直接量
$array = [
    "foo" => "bar",
    "bar" => "foo",
];
//格式4:有键名的索引数组直接量
$array = ["bar", "bar"];
var_dump($array);
?>

array()函数能够接受任意数量,用逗号分隔的键(Key)/值(Value),键值之间通过=>运算符俩呢及。键(Key)可以是一个整数或字符串,值(Value)可以是任意类型的数据。可以通过在方括号内指定键名来访问数组元素,或者给数组赋值。$arr[key] = value;

(2)object(对象)

对象是面向对象编程的基础,再PHP中使用new语句实例化一个类,即可创建一个对象。示例:下面代码定义一个foo类,然后使用new语句获取一个实例对象。

<?php
class foo
{                                   //创建一个类
    function do_foo()
    {
        echo "Doing foo."; 
    }
}

$bar = new foo;                     //创建对象
$bar->do_foo();                     //调用对象包含的函数
?>
(3)Callback/Callable(可调用)

自 PHP 5.4 起可用 callable 类型指定回调类型 callback。一些函数如 call_user_func()usort()可以接受用户自定义的回调函数作为参数。回调函数不止可以是简单函数,还可以是对象的方法,包括静态类方法。

特殊类型

(1)resource(资源)

资源也称为句柄,是一种特殊的变量,保存到外部资源的一个引用。资源一般通过专门的函数来定义和使用。需要注意的是,资源类型从PHP4开始引进,由于资源类型变量保存有为打开文件、数据库连接、图形画布区域等的特殊语句,因此将其他类的值转换为资源类型没有意义。在使用资源时,系统会自动启用垃圾回收机制,释放不再适应的资源,避免占用烯烃资源。因此,很少需要手工释放内存。

(2)NULL(空值)

空值就是表示该变量没有设置任何值,其值为一个特殊的值——NULL,该值不区分大小写。当变量被赋予空值时,可能有三种情况:变量还没有被赋值,或者变量被主动赋null空值,或者是被unset()函数处理过的变量。例如:

<?php
$var = NULL;       
?>

将一个变量转换为null类型,将会删除该变量。从PHP4开始,unset()函数就不再有返回值,所以用户不要试图获取或输出unset()

使用is_null()函数可以判断变量是否为null,该函数返回值为布尔值,如果变量为null,则返回True,否则返回False;而unset()函数是用来销毁指定的变量。

PHP数据类型转换

尽管PHP是一种弱类型语言,但有时还是需要用到类型转换。转换的方法很简单,只需要在变量前面加上用括号括起来的类型名称即可,具体如下表:

转换操作符 说明
(bool)(boolean) 转换为布尔型
(string) 转换无字符串
(int)(integer) 转换为整型
(float)(double)(real) 转换为浮点数
(array) 转换为数组
(object) 转换为对象
(unset) 转换无NULL
(binary)、b 前缀 转换为二进制字符串
PS:除了使用强制转换外,还可以使用settype()函数转换数据类型。语法格式为:bool settype ( mixed &$var , string $type)

第一个参数为变量名,第二个参数值为要转换的类型字符串,包括 boolean、float、integer、string、null、array、object。settype()函数的返回值为布尔值,若类型转换成功,则返回True,否则返回False。样例:

<?php
  $num = '3.1415926abc';      //声明字符串变量
  echo (integer) $num;        //把变量强制转换为整型
  echo '<p>';
  echo $num;                  //输出原始变量值
  echo '<p>';
  echo settype($num,'float'); //输出把变量转换为浮点数的结果
  echo '<p>';
  echo $num;                  //被转换为浮点数后的变量值
?>
  • 转换为布尔值

要明确地讲一个值转换为布尔值,应该使用(bool)或者(boolean)来强制转换。但是很多情况下不需要强制转换,因为当运算符、函数或者流程控制结构需要一个boolean参数时,该值会被自动转换。

在PHP中,并不只是False才是假的。在特定上下文中,下面的布尔值也被认为是假的。

  • 0:整型值零。
  • 0.0:浮点型值零。
  • "0":字符串零。
  • "":空白字符串。
  • 空数组:不包括任何元素的数组。
  • 空对象:不包括任何成员变量的对象(仅PHP1.0适用)。
  • 特殊类型NULL(包括尚未设定的变量)。
  • 从没有任何标记的XML文档生成的SimpleXML对象。

其它所有值都被认为是True(包括任何资源)。注意:-1和其它非零值(不论正负)一样,被认为是真。样例:

<?pp
  var_dump((bool) "");      //bool(False)
  var_dump((bool) 1);       //bool(True)
  var_dump((bool) "1");     //bool(True)
  var_dump((bool) array()); //bool(False)
  var_dump((bool) "False"); //bool(True)
?>
  • 转换为整型

要明确地将一个值转换为整型,可以使用int()(integer)强制转换。不过大多数情况下都不需要强制转换,因为当运算符、函数或流程控制需要一个整型参数时,值会自动转换。还可以通过intval()函数将一个值转换成整型。

当从布尔值转换整数值时,False 将被转换为 0 ,True 将被转换为 1 。当从浮点数转换成整数时,将向零取整。如果浮点数超出了整数范围,则结果不确定,因为没有足够的精度把浮点数转换为确切的整数结果。在此情况下没有警告,甚至没有任何通知。

不要将未知的分数强制转换为整数型,这样会导致不可预料的结果。样例:

<?php
  echo (int) ( (0.1+0.7) * 10 );      //显示7
?>
  • 转换为字符串

一个值可以通过在其前面加上(string)或用strval()函数来转变成字符串。在一个需要字符串的表达式中,字符串会自动转变。例如,在使用函数echo()print()时,或在一个变量和一个字符串进行比较时,就会发生这种转变类型。

  • 一个布尔型的True值被转换成字符串“1”,而布尔型的False值将被转换成""(空的字符串)。这种转变可以在布尔值和字符串之间随意进行。
  • 一个整数或浮点数将被转换为数字的字面样式的字符串(包括浮点数中的指数部分),使用指数计数法的浮点数(16.1E+6)也可转变。
  • 数组转换成字符串"Array",因此,echo()和print()无法显示出数组的值。如果显示一个数组值,可以用echo $arr['foo']结构
  • 资源总会被转换成"Resource id#1"结构的字符串,其中1是PHP分配刚给该资源的独特数字。
  • NULL总是被转变成空的字符串。

检测数据类型

PHP内置了众多检测数据类型的函数,可以根据需要对不同类型数据进行检测,判断变量是否属于某种特定的类型,如果符合则返回True,否则返回False。具体如下:

检测函数 说明
is_bool 检测变量是否为布尔型
is_string 检测变量是否为字符串
is_float 检测变量是否为浮点型
is_double 检测变量是否为浮点型
is_integer 检测变量是否为整型
is_int 检测变量是否为整型
is_null 检测变量是否为空值类型
is_array 检测变量是否为数组类型
is_object 检测变量是否为对象类型
is_numeric 检测变量是否为数字,或者是数字组成的字符串

样例:下面代码先使用is_float()函数检测变量是否为浮点数,然后根据检测返回值,及时进行提示。

<?php
$num = '3.1415926abc';
if (is_float($num))
    echo '变量$num是浮点数!';
else
    echo '对不起,变量$num不是浮点数!';
?>

 

冰凝梦想公众号

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: