PHP 支持多种数据类型,包括:String(字符串)、Integer(整型)、Float(浮点型)、Boolean(布尔型)、Array(数组)、Object(对象)、NULL(空值)。理解这些数据类型是 PHP 编程的基础。
PHP 是一种弱类型语言,变量类型会根据上下文自动转换。但了解各种数据类型的特点仍然非常重要。
字符串是由字符组成的序列,用于表示文本数据。
<?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
?>
<?php
// HEREDOC(解析变量)
$str = <<<EOD
这是一个多行字符串
可以包含变量:$name
以及换行符。
EOD;
echo $str;
// NOWDOC(不解析变量)
$str = <<<'EOD'
这是一个多行字符串
不会解析变量:$name
EOD;
echo $str;
?>
整型是不含小数部分的数字。
<?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
// 小数形式
$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 扩展。
布尔型只有两个值: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
// 索引数组
$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
// 类定义
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);
?>
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
// 文件资源
$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
// 严格模式
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
// 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 进一步增强了类型系统,引入了联合类型、mixed 类型等。
<?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
?>
<?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() |