PHP 数据类型

数据类型是一种编程语言可以处理的数据单元,PHP 支持 10 种原始数据类型,包括:

四种标量类型:bool(布尔型)、int(整型)、float(浮点型,也叫 double)、string(字符串)

四种复合类型:array(数组)、object(对象)、callable(可调用)、iterable(可迭代)

两种特殊类型:resource(资源)、NULL(无类型)

以上类型不需要由程序员手动指定的,而是由 PHP 解释器根据变量的上下文在运行时决定的。

调试技巧:如果想查看某个变量的值和类型,可以用 var_dump() 函数。


PHP Boolean 布尔类型

这是最简单的类型,boolean 表达了真值,取值范围是 truefalse

<?php
$is_car = true;

要明确地将一个值转换成 boolean,可以用函数 boolval() 来强制转换。

但是很多情况下不需要用强制转换,因为当上下文需要一个 boolean 参数时,该值会被 PHP 自动转换。

<?php
$is_human = boolval('PHPer');

PHP Integer 整型

integer 是集合 ℤ = {..., -2, -1, 0, 1, 2, ...} 中的某个数。

最大值可以用常量 PHP_INT_MAX 来表示,最小值可以在 PHP 7.0.0 及以后的版本中用常量 PHP_INT_MIN 表示。

<?php
$num = 1234; // 十进制数
$num = 0123; // 八进制数 (等于十进制 83)
$num = 0x1A; // 十六进制数 (等于十进制 26)
$num = 0b11111111; // 二进制数字 (等于十进制 255)
$num = 1_234_567; // 整型数值 (PHP 7.4.0 以后)

要明确地将一个值转换为 integer,可以用函数 intval() 来强制转换。

不过大多数情况下都不需要强制转换,因为当上下文需要一个 integer 参数时,值会自动转换。


PHP Float 浮点型

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

<?php
$a = 1.234; 
$b = 1.2e3; 
$c = 7E-10;
$d = 1_234.567; // 从 PHP 7.4.0 开始支持

警告:由于内部表达方式的原因,不要比较两个浮点数是否相等。


PHP String 字符串

一个字符串 string 就是由一系列的字符组成,其中每个字符等同于一个字节。

注意: string 最大可以达到 2GB。

一个字符串可以用 4 种方式表达:单引号、双引号、heredoc 语法结构、nowdoc 语法结构(自 PHP 5.3.0 起)

<?php
$str = '这是一个字符串';        // 单引号

$str = "这也是一个字符串";    // 双引号

$str = <<<EOD
使用nowdoc语法
跨越多行
使用字符串
EOD;    // Heredoc 结构

$str = <<<'EOD'
使用nowdoc语法
跨越多行
使用字符串
EOD;    // Nowdoc 结构,很像 heredoc 结构,但 nowdoc 中不进行解析操作,标识符要用单引号括起来

如果字符串是包围在双引号("")中, 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 起)
\eEscape(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 Array 数组

PHP 中的数组array实际上是一个有序映射,所以只要掌握数组array就等于掌握列表(向量)、散列表(是映射的一种实现)、字典、集合、栈、队列以及更多可能性。

<?php
$array = array(
    "foo" => "bar",
    "bar" => "foo",
);

// 自 PHP 5.4 起
$array = [
    "foo" => "bar",
    "bar" => "foo",
];


PHP Object 对象

要创建一个新的对象 object,使用 new 语句实例化一个类:

<?php
class foo
{
    function do_foo()
    {
        echo "Doing foo."; 
    }
}

$bar = new foo;
$bar->do_foo();

如果其它任何类型的值被转换成对象,将会创建一个内置类 stdClass 的实例。

如果该值为 null,则新的实例为空。

array 转换成 object 将使键名成为属性名并具有相对应的值。

<?php
$obj = (object) ['1' => 'foo'];
var_dump(isset($obj->{'1'})); // PHP 7.2.0 后输出 'bool(true)',之前版本会输出 'bool(false)' 
var_dump(key($obj)); // PHP 7.2.0 后输出 'string(1) "1"',之前版本输出  'int(1)'

PHP Callback / Callable 类型

自 PHP 5.4 起可用 callable 类型指定回调类型 callback。

一些函数如 call_user_func() 或 usort() 可以接受用户自定义的回调函数作为参数。

回调函数不止可以是简单函数,还可以是对象的方法,包括静态类方法。

<?php 

// 回调函数例子
function my_callback_function() {
    echo 'hello world!';
}

// 回调方法例子
class MyClass {
    static function myCallbackMethod() {
        echo 'Hello World!';
    }
}

// Type 1: 简单回调
call_user_func('my_callback_function'); 

// Type 2: 静态方法作为回调
call_user_func(array('MyClass', 'myCallbackMethod')); 

// Type 3: 对象方法作为回调
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));

// Type 4: 静态方法作为回调 (PHP 5.2.3 以后支持)
call_user_func('MyClass::myCallbackMethod');

$c = new C();
call_user_func($c, 'PHP!');

PHP Iterable 可迭代对象

Iterable是 PHP 7.1 中引入的一个伪类型,它接受任何 array 或实现了 Traversable 接口的对象,这些类型都能用 foreach 迭代,也可以和生成器里的 yield from 一起使用。

<?php

function foo(iterable $iterable) {
    foreach ($iterable as $value) {
        // ...
    } 
}

PHP Resource 资源类型

资源 resource 是一种特殊变量,保存了到外部资源的一个引用,resource 是通过专门的函数来建立和使用的。

resource 类型变量保存有为打开文件、数据库连接、图形画布区域等的特殊句柄。


PHP NULL 无类型

特殊的 null 值表示一个变量没有值,NULL 类型唯一的值就是 null。

在下列情况下一个变量被认为是 null:被赋值为 null、尚未被赋值、被 unset()。


PHP 类型转换和类型比较

PHP 中的类型强制转换和 C 中的非常像:在要转换的变量之前加上用括号括起来的目标类型。

<?php
$foo = 10;   // $foo是一个整数
$bar = (boolean) $foo;   // $bar是一个布尔值

允许的强制转换有:

  • (int), (integer) - 转换为整形 integer

  • (bool), (boolean) - 转换为布尔类型 boolean

  • (float), (double), (real) - 转换为浮点型 float

  • (string) - 转换为字符串 string

  • (array) - 转换为数组 array

  • (object) - 转换为对象 object

  • (unset) - 转换为 NULL

以下的表格显示了 PHP 类型 和 比较运算符 在松散和严格比较时的作用。

注意:HTML 表单并不传递整数、浮点数或者布尔值,它们只传递字符串,要想检测一个字符串是不是数字,可以使用 is_numeric() 函数。

注意:在没有定义变量 $x 的时候,诸如 if ($x) 的用法会导致一个 E_NOTICE 级别的错误,所以,可以考虑用 empty() 或者 isset() 函数来初始化变量。

注意:某些数值操作会导致一个特殊值,可以用常量 NAN 表示。 无论是松散还是严格比较,这个值和其他任意值(包括它自身,但排除 true)比较时都会产生 false 的结果, 例如 NAN != NAN 和 NAN !== NAN。 导致 NAN 的操作例子包括 sqrt(-1)、asin(2)、 acosh(0)。