types of variable

变量类型

详细为你介绍在PHP中的所有变量类型

在 PHP 中,变量类型的概念被弱化了一些,但不代表你不需要理解。在某些程序中(比如金钱交易就必须要用浮点型的变量来处理)对变量类型的要求是极为严格的。了解了变量的类型将会对你学习 PHP 有很大的帮助,其他语言同理。

PHP 给我们提供了 8 种原始数据类型,如下:

可能还会读到一些关于“双精度(double)”类型的参考。实际上 doublefloat 是相同的,由于一些历史的原因,这两个名称同时存在。

在 PHP 中,你可以随时使用 var_dump() 函数来查看一个变量的类型。下面,我将详细的为你讲解这八种类型的意义。

String 字符串类型

字符串是由一系列的数字和字母组合而成的数据类型,你可以用它来声明一个人的名字、定义一首诗、甚至是一篇很长很长的文章。是的,字符串可以被声明为无限长度的内容,比如你现在正在看的这篇教程,也只不过是一个变量储存的值罢了。因为 PHP 没有对它的长度作出明确的限制。

字符串听起来简单,但是声明它的方式有好几种,并且每种都有严格意义上的区别。这也是新手常常会被绕晕的概念和用法,不过不用担心,我会细细的为你讲解它的几种声明方式:

单引号声明

如果你很仔细的看过前面的教程,你会发现在大部分的代码示例中,我声明变量都是用单引号声明的,这也是最简单的声明一个字符串类型变量的方式。在单引号中,PHP 不会试图解析其中的变量、表达式和转义字符(这个我会在双引号一节中解释),所以这是效率最高的声明字符串变量的方式,如果你要声明一个很简单很单一的字符串(人名、地名等固定不变的数据),我很 推荐 大家使用单引号来声明字符串类型的变量。

在单引号中,不可以再夹杂单引号进去。如果必须要有单引号,请在单引号前加一个转义字符 \ (反斜杠)。那么问题来了:既然 \ 是一个特殊字符,那我也想把它当做字符串来输出怎么办么?再在前面加一个 \ 就好啦!(这就是为什么我会说有点晕的原因)。

以下代码你可以复制到 RUNPHP 中在线运行,查看输出结果,以便你更好的理解。下面请看示例:


<?php
// 简单声明一个字符串
$string = 'I am a learner in wowphp!';
echo $string; // 输出 I am a learner in wowphp!

//在单引号中要使用单引号必须使 \ 来转义
$string = 'I am a \'learner\'in wowphp!';
echo $string; // 输出 I am a 'learner'in wowphp!

// 在单引号中不会解析变量和其他转义字符
$name   = 'WOWPHP';
$string = 'I am \n a \'learner\' \t in {$name}!';
echo $string; // 输出 I am \n a 'learner' \t in {$name}!'
        

你可以看到,在单引号中掺入变量,PHP 会原封不动的将他当做字符串的一部分输出。(这就像是搭好了 Apache/Nginx 却没有挂好 PHP,导致访问 PHP 文件会直接丢给你源文件一样。)

双引号声明

前面单引号说了那么多,其实它的特性反过来就是双引号的特点了。如果你使用双引号来声明一个字符串,PHP 会试图查找其中的变量或转义字符并解析它们。那么一直说的转义字符都有哪些呢?请见下表:

序列 含义
\n 换行(ASCII 字符集中的 LF 或 0x0A (10))
\r 回车(ASCII 字符集中的 CR 或 0x0D (13))
\t 水平制表符(ASCII 字符集中的 HT 或 0x09 (9))
\v 垂直制表符(ASCII 字符集中的 VT 或 0x0B (11))(自 PHP 5.2.5 起)
\e Escape(ASCII 字符集中的 ESC 或 0x1B (27))(自 PHP 5.4.0 起)
\f 换页(ASCII 字符集中的 FF 或 0x0C (12))(自 PHP 5.2.5 起)
\\ 反斜线
\$ 美元标记
\" 双引号
\[0-7]{1,3} 符合该正则表达式序列的是一个以八进制方式来表达的字符
\x[0-9A-Fa-f]{1,2} 符合该正则表达式序列的是一个以十六进制方式来表达的字符

如果你在双引号中使用了上述特殊转义字符,它们都会被解析为表中对应的含义。我稍后会在示例中向你演示。

下面来说一下双引号中解析变量:在双引号中,PHP 提供了解析变量、数组中的值、对象的属性方法和值。甚至是更复杂的表达式(用花括号括起来)!在遇到美元符号开始的字符,PHP 都会试图去解析。不过,如果你真的想要 PHP 去解析你在字符串中的变量的话,我建议你都用花括号括起来,明确告诉 PHP 这个变量是需要解析的。请见如下代码示例:


<?php
// 用双引号声明一个简单字符串(不建议这么做)
$string = "My name is WOWPHP!";
echo $string;

// 定义一个变量 name
$name = 'WOWPHP';

// 在字符串中使用变量 使用大括号括起来
$string = "My name is {$name}!";
echo $string;

// 在字符串中使用更多的转义字符
$string = "My \t name is \n \"{$name}\"!";
echo $string;

// 如果我不想解析变量 转义$即可 还不如使用单引号...
$string = "My name is \$name";
echo $string;

// 请注意以下几个特例
// 就是为什么要使用 {} 的原因
$string = "My name is $name's";
// 会输出:My name is WOWPHP's
// 因为$name's不是一个有效变量名 但 PHP 会解析 $name
echo $string; 

// 如果这样写就不会解析 $name 而会解析 $names
// 因为 $names 是一个合法变量 但我没有定义 $names
$string = "My name is $names";
echo $string; // 输出:My name is 
        

一般来说,面试题经常会拿这些很饶人的概念来考你,所以搞清楚它们的用法是很 重要 的。我例举的这些例子中,你除了看懂外,还需要学会举一反三,自己在 https://run.wowphp.com 中尝试写一些代码看一下效果,以便你更好地记忆它们。

Heredoc 声明字符串

第三种表达字符串的方法是用 heredoc 句法结构:<<<。在该运算符之后要提供一个标识符,然后换行。接下来是字符串 string 本身,最后要用前面定义的标识符作为结束标志。

结束时所引用的标识符必须在该行的第一列,而且,标识符的命名也要像其它标签一样遵守 PHP 的规则:只能 包含字母、数字和下划线,并且必须以字母和下划线作为开头。

也就是说,所谓的标识符你可以自己规定,为了符合规范,建议使用 EOF , EOD , EOT 这三个标识符其中的一种。当然,你也可使用其他字符,只要保证开始标记和结束标记不在正文中出现即可。请看代码示例:


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

/* 含有变量的更复杂示例 */
class foo
{
    var $foo;
    var $bar;

    function foo()
    {
        $this->foo = 'Foo';
        $this->bar = array('Bar1', 'Bar2', 'Bar3');
    }
}

$foo = new foo();
$name = 'MyName';

echo <<<EOT
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should print a capital 'A': \x41
EOT;

// 注意 在结束标识后面↑必须有一个换行
        

以下是一个不符合上述规范的例子:


<?php
class foo {
    public $bar = <<<EOT
bar
    EOT;
}
?>
        

Integer 整型

顾名思义,整型变量用于存储一个整数,例如1,3,78,-23,-999等。

整型由所有数字构成,而且其赋值范围与 C 语言编译器的 long 值范围一致。在许多通用的计算机 32 位系统中,带符号的整型数的取值范围是 -2147483648~+2147483648。整型数可以用十进制、十六进制和八进制编写,而且包含正整数和负整数。

请看以下声明整型变量的例子:


<?php
$int = 100; // 声明一个正整数
$int = -300; // 声明一个负整数
$int = 007; // 用八进制声明一个整数
$int = 0X7B; // 用十六进制声明整数
        

在上述例子中,你也可以在八进制和十六进制加上 +- 来表示数据的正负。当然,+ 可以省略。在上文中,我说了整型的赋值是有范围的,所以你 不能 声明不在这个范围的数字,如果非超不可,那么这个变量将会被解析为接下来将要讲的 float 类型。

Float/Double 浮点类型

浮点数(亦为双精度数或实数)是包含小数部分的数,通常用于表示整型无法表示的数。例如:金钱,距离,速度等。在 32 位系统中,浮点数的取值范围为 1.7E-38~1.7E+38,也可以用科学技术法来表示,只是一种近似的数,有效精度为 15 位。因此,比较两个浮点数是否相等是没有意义的

请看以下代码示例:


<?php
$float = 3.1415; // 最常用的浮点数声明方式
$float = 2.17e3; // 2.17x10^3 或者 2170
$float = 31E-2;  // 31x10^-2 或者 0.31
$float = 2.0E+308;	// 溢出 得到结果 1#INF
        

当一个浮点数超过了有效精度时,将会溢出。此时,系统将会输出 1#INF-1#INF 的溢出标识。

Boolean 布尔类型

这是最简单的类型。boolean 表达了真值,可以为 TRUE 或 FALSE,即 「真」和「假」。在PHP中进行任何比较计算(也叫关系计算)、布尔运算(也叫逻辑运算)时,返回的结果都是布尔值,它们是构成 PHP 逻辑控制的判断依据。

用法示例

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

// 这样做是不必要的...
if ($show_separators == TRUE) {
    echo "<hr>\n";
}

// ...因为可以使用下面这种简单的方式:
if ($show_separators) {
    echo "<hr>\n";
}
        

由于 PHP 语言的特殊性(弱类型语言),在任何判断代码(如 if、循环)语句中,其他数据类型都会被转换为布尔类型,以便查询条件是否满足。它们具体的转换关系请见如下描述(请严格牢记):

当转换为 boolean 时,以下值被认为是 FALSE:

  • 布尔值 FALSE 本身
  • 整型值 0(零)
  • 浮点型值 0.0(零)
  • 空字符串,以及字符串 "0"
  • 不包括任何元素的数组
  • 不包括任何成员变量的对象(仅 PHP 4.0 适用)
  • 特殊类型 NULL(包括尚未赋值的变量)
  • 从空标记生成的 SimpleXML 对象

所有其它值都被认为是 TRUE(包括任何资源);-1 和其它非零值(不论正负)一样,被认为是 TRUE

请登录

WOWPHP 账号登录 GitHub 账号登录

还没有账号?现在去注册一个~