PHP 数据类型详解

PHP 支持多种数据类型,包括:String(字符串)、Integer(整型)、Float(浮点型)、Boolean(布尔型)、Array(数组)、Object(对象)、NULL(空值)。理解这些数据类型是 PHP 编程的基础。

数据类型概述

PHP 是一种弱类型语言,变量类型会根据上下文自动转换。但了解各种数据类型的特点仍然非常重要。

标量类型(4种)

  • 字符串(string)
  • 整型(integer)
  • 浮点型(float)
  • 布尔型(boolean)

复合类型(2种)

  • 数组(array)
  • 对象(object)

特殊类型(2种)

  • NULL
  • 资源(resource)

PHP 字符串(String)

字符串是由字符组成的序列,用于表示文本数据。

字符串定义方式

单引号和双引号

<?php
// 双引号字符串
$x = "Hello world!";
echo $x;
echo "<br>";

// 单引号字符串
$x = 'Hello world!';
echo $x;
echo "<br>";

// 双引号中的变量解析
$name = "John";
echo "Hello $name";  // 输出: Hello John
echo "<br>";

// 单引号中的变量不解析
echo 'Hello $name';  // 输出: Hello $name
?>

HEREDOC 和 NOWDOC

多行字符串定义

<?php
// HEREDOC(解析变量)
$str = <<<EOD
这是一个多行字符串
可以包含变量:$name
以及换行符。
EOD;
echo $str;

// NOWDOC(不解析变量)
$str = <<<'EOD'
这是一个多行字符串
不会解析变量:$name
EOD;
echo $str;
?>

PHP 整型(Integer)

整型是不含小数部分的数字。

整型规则

  • 必须至少包含一个数字(0-9)
  • 不能包含逗号或空格
  • 不能有小数点
  • 可以是正数或负数
  • 支持十进制、十六进制(0x前缀)、八进制(0前缀)、二进制(0b前缀)

整型示例

<?php
// 十进制
$x = 5985;
var_dump($x);
echo "<br>";

// 负数
$x = -345;
var_dump($x);
echo "<br>";

// 十六进制
$x = 0x8C;
var_dump($x);  // 输出: int(140)
echo "<br>";

// 八进制
$x = 047;
var_dump($x);  // 输出: int(39)
echo "<br>";

// 二进制(PHP 5.4+)
$x = 0b1100;
var_dump($x);  // 输出: int(12)
echo "<br>";

// 大整数(PHP自动处理)
$big = 9223372036854775807;
var_dump($big);
?>

PHP 浮点型(Float)

浮点数是带小数部分的数字,或是指数形式。

浮点数示例

<?php
// 小数形式
$x = 10.365;
var_dump($x);
echo "<br>";

// 科学计数法
$x = 2.4e3;  // 2.4 × 10³ = 2400
var_dump($x);
echo "<br>";

$x = 8E-5;   // 8 × 10⁻⁵ = 0.00008
var_dump($x);
echo "<br>";

// 浮点数精度问题
$a = 0.1 + 0.2;
$b = 0.3;
var_dump($a == $b);  // 输出: bool(false) - 由于浮点精度
?>

注意:浮点数计算可能存在精度问题,对于精确计算(如货币),建议使用整数(以分为单位)或 bcmath 扩展。

PHP 布尔型(Boolean)

布尔型只有两个值:true 或 false。

布尔值示例

<?php
// 直接赋值
$x = true;
$y = false;

// 在条件判断中使用
if ($x) {
    echo "x 为真";
}

// 转换为布尔值的规则
var_dump((bool) "");        // bool(false)
var_dump((bool) "0");       // bool(false)
var_dump((bool) "1");       // bool(true)
var_dump((bool) 0);         // bool(false)
var_dump((bool) 1);         // bool(true)
var_dump((bool) array());   // bool(false)
var_dump((bool) array(1));  // bool(true)
var_dump((bool) null);      // bool(false)
?>

PHP 数组(Array)

数组可以在单个变量中存储多个值。

数组创建方式

数组示例

<?php
// 索引数组
$cars = array("Volvo", "BMW", "Toyota");
var_dump($cars);

// 关联数组
$age = array("Peter" => 35, "Ben" => 37, "Joe" => 43);
var_dump($age);

// 短数组语法(PHP 5.4+)
$fruits = ["Apple", "Banana", "Orange"];
var_dump($fruits);

// 多维数组
$matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
];
var_dump($matrix);
?>

PHP 对象(Object)

对象是类的实例,可以包含属性和方法。

对象示例

<?php
// 类定义
class Car {
    // 属性
    public $color;
    public $model;

    // 构造函数
    public function __construct($color, $model) {
        $this->color = $color;
        $this->model = $model;
    }

    // 方法
    public function getInfo() {
        return "这辆车是 " . $this->color . " 颜色的 " . $this->model;
    }
}

// 创建对象
$myCar = new Car("红色", "Toyota");
echo $myCar->getInfo();  // 输出: 这辆车是 红色 颜色的 Toyota
echo "<br>";

// 查看对象信息
var_dump($myCar);
?>

PHP NULL 值

NULL 表示变量没有值,是数据类型为 NULL 的值。

NULL 示例

<?php
// 变量赋值为 NULL
$x = "Hello world!";
$x = null;
var_dump($x);  // 输出: NULL

// 未赋值的变量
var_dump($undefined_var);  // 输出: NULL

// 使用 unset() 函数
$y = "test";
unset($y);
var_dump($y);  // 输出: NULL

// 检查是否为 NULL
$z = null;
var_dump(is_null($z));  // 输出: bool(true)
?>

PHP 资源类型(Resource)

资源是一种特殊变量,保存了到外部资源的一个引用,如数据库连接、文件句柄等。

资源类型示例

<?php
// 文件资源
$file = fopen("test.txt", "r");
var_dump($file);  // 输出: resource(5) of type (stream)

// 数据库连接资源(示例)
// $conn = mysqli_connect("localhost", "user", "password", "database");
// var_dump($conn);

// 记得关闭资源
fclose($file);
?>

PHP 7 类型声明

PHP 7 引入了标量类型声明,可以指定函数参数和返回值的类型。

标量类型声明

类型声明示例

<?php
// 严格模式
declare(strict_types=1);

function addNumbers(int $a, int $b): int {
    return $a + $b;
}

function greetUser(string $name): string {
    return "Hello, " . $name;
}

function isAdult(float $age): bool {
    return $age >= 18.0;
}

// 使用
echo addNumbers(5, 10);  // 输出: 15
echo "<br>";
echo greetUser("John");  // 输出: Hello, John
echo "<br>";
var_dump(isAdult(20.5)); // 输出: bool(true)
?>

可空类型(PHP 7.1+)

可空类型示例

<?php
// PHP 7.1+ 可空类型
function findUser(?string $username): ?array {
    if ($username === null) {
        return null;
    }
    // 模拟查找用户
    return ['name' => $username, 'age' => 25];
}

var_dump(findUser("john"));  // 返回数组
var_dump(findUser(null));    // 返回 NULL
?>

PHP 8 类型系统增强

PHP 8 进一步增强了类型系统,引入了联合类型、mixed 类型等。

联合类型(Union Types)

联合类型示例

<?php
// PHP 8+ 联合类型
function displayValue(string|int|float $value): void {
    echo "值: " . $value . "<br>";
}

function processInput(array|string $input): string {
    if (is_array($input)) {
        return implode(", ", $input);
    }
    return $input;
}

displayValue(123);       // 输出: 值: 123
displayValue("Hello");   // 输出: 值: Hello
displayValue(45.67);     // 输出: 值: 45.67

echo processInput(["apple", "banana"]);  // 输出: apple, banana
?>

mixed 类型

mixed 类型示例

<?php
// PHP 8+ mixed 类型
function handleData(mixed $data): string {
    return gettype($data);
}

echo handleData("string");  // 输出: string
echo handleData(123);       // 输出: integer
echo handleData([]);        // 输出: array
?>

类型检测和转换

类型检测函数

类型检测示例

<?php
$value = "123";

// 类型检测
var_dump(is_string($value));  // bool(true)
var_dump(is_int($value));     // bool(false)
var_dump(is_numeric($value)); // bool(true)

// 获取类型
echo gettype($value);         // 输出: string

// 类型比较
$num = 123;
var_dump($value === $num);    // bool(false) - 严格比较
var_dump($value == $num);     // bool(true) - 松散比较
?>

类型转换

类型转换示例

<?php
// 显式类型转换
$str = "123";
$int = (int)$str;        // 转换为整数
$float = (float)$str;    // 转换为浮点数
$bool = (bool)$str;      // 转换为布尔值

var_dump($int);   // int(123)
var_dump($float); // float(123)
var_dump($bool);  // bool(true)

// 使用函数转换
$number = intval("456");
$text = strval(789);
?>

数据类型总结

数据类型 描述 示例
String 字符序列 "Hello", 'World'
Integer 整数值 123, -456, 0x1A
Float 浮点数 3.14, 2.5e3
Boolean 真/假值 true, false
Array 值的集合 [1,2,3], ["a"=>1]
Object 类的实例 new ClassName()
NULL 空值 null
Resource 外部资源引用 fopen(), mysqli_connect()