Skip to content

PHP 数据类型

PHP 中的变量可以存放不同类型的数据。PHP 是一种动态类型语言(dynamically typed language),这意味着你通常不需要提前声明变量的类型;PHP 会根据赋给变量的值来确定其类型。

PHP 支持以下标量(scalar)类型:

  • bool: 表示布尔值(true 或 false)。
  • int: 表示整型(整数)。
  • float: 表示浮点数(也称为 double 或实数)。
  • string: 表示字符串(字符序列)。

PHP 支持以下复合(compound)类型:

  • array: 表示有序映射(ordered map),可以存放多种类型的值。
  • object: 表示用户定义类的一个实例(instance)。
  • callable: 表示对函数或方法的引用。
  • iterable: 表示任何可以用 foreach 循环遍历的类型(数组或实现了 Traversable 接口的对象)。

以及两种特殊(special)类型:

  • resource: 一种特殊变量,持有对外部资源(如文件句柄或数据库连接)的引用。
  • null: 表示一个变量没有值。

字符串是字符序列。字符串可以使用单引号 ('...')、双引号 ("...") 或 Heredoc/Nowdoc 语法定义。

  • 单引号 ('...'): 按字面意思处理内容,但 \'(字面单引号)和 \\(字面反斜杠)除外。变量和转义序列不会被解释。
  • 双引号 ("..."): 会解析变量(例如,"Hello $name")并解释转义序列(例如,"\n" 表示换行,"\t" 表示制表符)。
<?php
$name = "World";
$x = "Hello $name!\n"; // Variable interpolated, newline interpreted
$y = 'Hello $name!\n'; // Literal string: Hello $name!\n
echo $x;
echo $y;
?>

整型是非小数数字。整型的大小取决于平台(32 位或 64 位),不过在大多数现代系统上,64 位是标准的。

你可以使用常量 PHP_INT_MAX 和 PHP_INT_MIN 找到系统上的最大和最小整型值。

整型的规则:

  • 必须包含至少一个数字。
  • 不能包含小数点。
  • 可以是正数或负数。
  • 可以用十进制(基数 10)、十六进制(基数 16,前缀为 0x)、八进制(基数 8,前缀为 0)或二进制(基数 2,前缀为 0b)表示。

var_dump() 函数对于检查变量的类型和值非常有用:

<?php
$decimal_int = 1234;
$negative_int = -567;
$hex_int = 0xFF; // 255 in decimal
$octal_int = 0755; // 493 in decimal
$binary_int = 0b1010; // 10 in decimal
var_dump($decimal_int);
var_dump($hex_int);
echo "Max Integer: " . PHP_INT_MAX . "\n";
?>

输出(示例):

int(1234)
int(255)
Max Integer: 9223372036854775807

浮点数(也称为 double)是带小数点的数字或指数(科学记数)表示的数字。

警告:由于二进制浮点表示的特性,像 0.1 或 0.7 这样简单的十进制分数无法精确表示。比较浮点数是否相等时要小心;应使用一个小的容差值(epsilon)代替。

<?php
$a = 10.365;
$b = 2.5e3; // 2.5 * 10^3 = 2500
$c = 7E-10; // 7 * 10^-10
var_dump($a);
var_dump($b);
// Float comparison issue example
$float_sum = 0.1 + 0.7;
var_dump($float_sum); // Might output float(0.7999999999999999)
var_dump($float_sum == 0.8); // Might output bool(false)!
?>

布尔型表示两种可能的状态:true 或 false(不区分大小写)。

布尔型主要用于条件逻辑(if、else、循环)。许多值可以自动转换为布尔型 false:整数 0、浮点数 0.0、空字符串 "" 或 '0'、空数组 [] 以及特殊值 null。

<?php
$is_active = true;
$has_permission = false;
var_dump($is_active);
var_dump((bool) 0); // bool(false)
var_dump((bool) "Hello"); // bool(true)
?>

数组是有序映射(ordered map),可以在单个变量名下存储多个值。数组可以包含不同类型的值,并且可以使用数字索引或关联索引(使用字符串作为键)。

现代 PHP 使用短数组语法 [] 代替旧的 array() 结构。

<?php
// Numerically indexed array (indices start at 0)
$colors = ["Red", "Green", "Blue"];
var_dump($colors);
echo $colors[1]; // Outputs: Green
// Associative array (key-value pairs)
$user = [
'name' => 'John Doe',
'age' => 30,
'city' => 'New York'
];
var_dump($user);
echo $user['age']; // Outputs: 30
// Mixed array
$mixed = [10, 'Hello', true, 'city' => 'London'];
var_dump($mixed);
?>

数组在 PHP 中是基础概念,将在后续章节中更详细地介绍。

对象是类的一个实例(instance)。类是蓝图,定义了操作数据的属性(properties)和方法(methods,即函数)。

面向对象编程(Object-Oriented Programming,简称 OOP)是现代 PHP 中的一种主要编程范式。

<?php
// Define a simple class
class Car {
// Property declaration (with type hint PHP 7.4+)
public string $make;
public string $model;
// Constructor method (called when creating an object)
public function __construct(string $make, string $model) {
$this->make = $make;
$this->model = $model;
}
// Method
public function getDescription(): string {
return "This car is a " . $this->make . " " . $this->model;
}
}
// Create an object (instance) of the Car class
$myCar = new Car("Toyota", "Camry");
// Access properties and call methods using ->
var_dump($myCar);
echo $myCar->model . "\n"; // Outputs: Camry
echo $myCar->getDescription() . "\n"; // Outputs: This car is a Toyota Camry
?>

面向对象编程概念,如类、对象、继承和接口,将在专门的 OOP 章节中深入介绍。

null 是一种特殊数据类型,表示有意地缺少值。一个变量被认为是 null,如果:

  • 它被显式地赋了常量 null(不区分大小写)。
  • 它还没有被赋过值。
  • 它被 unset() 函数销毁。
<?php
$noValue = null;
var_dump($noValue); // Outputs: NULL
$x = "Hello world!";
var_dump($x);
// Unset the variable
unset($x);
var_dump($x); // Warning: Undefined variable $x; var_dump will output NULL
var_dump($undefinedVariable); // Warning: Undefined variable; var_dump will output NULL
?>

resource 是一种特殊变量类型,持有对外部资源的引用,例如打开的文件句柄、数据库连接或图像画布。

资源通常由特定的 PHP 函数创建和管理(例如 fopen()、mysqli_connect()、imagecreatefromjpeg())。它们通常需要使用 fclose()、mysqli_close()、imagedestroy() 等函数显式关闭或释放,以释放系统资源。

通常,除了将资源传递给相关的函数之外,你不会直接与它们交互。var_dump() 将显示类型为 ‘resource’ 及其内部 ID。

<?php
$filename = 'example.txt';
file_put_contents($filename, 'Some data');
// fopen returns a resource on success
$fileHandle = fopen($filename, 'r');
if ($fileHandle) {
var_dump($fileHandle); // Outputs something like: resource(5) of type (stream)
fclose($fileHandle); // Important to close the resource
} else {
echo "Failed to open file.";
}
?>