本节介绍 PHP 的其他数据类型。包括数组、对象、Resource 以及 NULL,也涵盖了不同数据类型之间的转换等知识点。

Array 数组

数组实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。由于数组元素的值也可以是另一个数组,树形结构和多维数组也是允许的。

语法
定义数组可以用 array() 或 [] 来新建一个数组。它接受任意数量用逗号分隔的键(key) => 值(value)对。key 可以是 integer(索引数组)或者 string(关联数组),value 可以是任意类型,如对象、数组。

在目录 /home/project 创建 test.php,并编辑内容

<?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
  • 数组可以多维嵌套,通过键名可以获取特定值

获取数组的长度-count()函数

  • count()函数的作用是:返回数组的长度(元素数);

排序数组
PHP提供了几个函数来对数组进行排序。我们将介绍不同的功能,并包括示例。

  • sort()函数的作用是:按字母/数字的升序(如A、B、C、D、E…5, 4, 3, 2, 1…)
  • rsort()函数的作用是:按字母/数字降序(如Z、Y、X、W、V…5, 4, 3, 2, 1…)
  • asort()函数的作用是:按字母/数字的升序对关联数组进行排序(如A、B、C、D、E…5, 4, 3, 2, 1…)
  • ksort()函数的作用是:按关键字按字母/数字的升序对关联数组进行排序…(如A、B、C、D、E…5, 4, 3, 2, 1…)
  • arsort()函数的作用是:根据数组的值,按字母/数字降序对数组进行排序(如Z、Y、X、W、V…5, 4, 3, 2, 1…)
  • krsort()函数的作用是:按关键字的字母/数字降序对关联数组进行排序(如Z、Y、X、W、V…5, 4, 3, 2, 1…)

Object 对象

使用 new 可以创建一个新的对象

<?php

class foo
{
function do()
{
echo "Action do";
}
}

$f = new foo;
$f->do();

转换为对象
如果将一个对象转换成对象,它将不会有任何变化。如果其它任何类型的值被转换成对象,将会创建一个内置类 stdClass 的实例。如果该值为 NULL,则新的实例为空。 array 转换成 object 将使键名成为属性名并具有相对应的值,除了数字键,不迭代就无法被访问。

在目录 /home/project 创建 a.php,并编辑内容

<?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);

执行 php a.php

从结果中可以看出

  • a 是对象,转换为对象后不发生变化,所以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 是弱语言类型,定义变量的时候不需要制定变量类型,根据上下文自动解成对于的变量类型。

编辑 /home/project/test.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 test.php

从结果中可以看出,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)