变量与数据类型
变量是存储数据的容器,数据类型决定了容器中能放什么样的数据。本页深入探讨 PHP 变量的声明规则、弱类型特性,以及八大基础数据类型的细节。
一、变量的声明与使用
在 PHP 中,变量以美元符号 $ 开头,后面跟着变量名。PHP 是一门弱类型语言,这意味着你在声明变量时不需要指定它的数据类型,PHP 引擎会根据你赋给它的值自动推断类型。
<?php
$siteName = "惜梦PHP"; // 自动推断为 string 类型
$year = 2024; // 自动推断为 int 类型
$pi = 3.14159; // 自动推断为 float 类型
$isOpenSource = true; // 自动推断为 bool 类型
echo $siteName; // 输出:惜梦PHP
变量命名规则
- 必须以字母 [a-zA-Z] 或下划线 _ 开头,不能以数字开头。
- 只能包含字母、数字 [0-9]、下划线。
- 严格区分大小写:$name 和 $Name 是两个完全不同的变量。
- 不能包含空格或特殊字符(如 @, #, $ 等)。
驼峰命名法是 PHP 社区最推荐的变量命名规范,即第一个单词首字母小写,后续单词首字母大写,例如:$getUserInfo、$baseUrl。
二、可变变量与引用赋值
1. 可变变量
这是一种特殊的用法,一个变量的值可以作为另一个变量的名字。通过在变量名前再加一个 $ 来实现。
<?php
$a = "hello";
$$a = "world"; // 此时相当于创建了 $hello = "world"
echo $a; // 输出:hello
echo $$a; // 输出:world
echo $hello; // 输出:world
2. 引用赋值 (&)
默认情况下,变量赋值是"值传递",即拷贝一份数据。如果希望两个变量指向同一份数据,可以使用引用符号 &。
<?php
$var1 = "惜梦";
$var2 = $var1; // 值传递:拷贝一份给 var2
$var3 = &$var1; // 引用传递:var3 和 var1 指向同一块内存
$var1 = "新值"; // 修改原变量
echo $var2; // 输出:惜梦 (不受影响)
echo $var3; // 输出:新值 (同步改变)
三、PHP 的八大数据类型
PHP 8 支持多种数据类型,主要分为三大类:标量类型、复合类型和特殊类型。
| 分类 | 类型 | 说明与示例 |
|---|---|---|
| 标量类型 (单值) |
String (字符串) |
文本数据,用单引号或双引号包裹。$s = "PHP"; |
Integer (整型) |
整数,不带小数点。支持十进制、八进制、十六进制。$i = 100; |
|
Float (浮点型) |
带小数点的数,或科学计数法。$f = 3.14; |
|
Boolean (布尔型) |
表示真假,只有两个值:true 和 false (不区分大小写)。 |
|
| 复合类型 (多值) |
Array (数组) |
有序的键值对集合。$arr = ['a', 'b']; |
Object (对象) |
类的实例化产物,包含属性和方法。 | |
| 特殊类型 | NULL (空类型) |
表示变量没有被赋值,或被显式赋值为 null。 |
Resource (资源) |
外部资源的引用(如打开的文件、数据库连接),PHP 8 中逐渐被对象替代。 |
单双引号区别:双引号中的变量和特殊转义字符(如 \n)会被解析;单引号中的内容除了 \\ 和 \' 外,其余一律按普通字符串原样输出。因此,不包含变量时使用单引号性能略高。
四、类型检测与强制转换
1. 类型检测函数
PHP 提供了一系列 is_* 函数来判断变量类型,返回布尔值。
<?php
$val = "100";
var_dump(is_string($val)); // bool(true)
var_dump(is_int($val)); // bool(false)
var_dump(is_numeric($val)); // bool(true) (判断是否为数字或数字字符串)
echo gettype($val); // 输出:string
2. 强制类型转换
在变量前加上用括号括起来的目标类型,即可进行强制转换。
<?php
$str = "50.8abc";
$int = (int)$str; // 截取整数部分,结果为 50
$float = (float)$str; // 截取浮点数部分,结果为 50.8
$bool = (bool)$str; // 非空非零字符串为 true
$arr = (array)$str; // 转为只有一个元素的数组
五、PHP 8.0+ 新特性:联合类型
虽然 PHP 是弱类型语言,但现代 PHP 鼓励在函数参数和返回值中使用类型声明。PHP 8.0 引入了联合类型,允许一个参数接受多种不同的类型。
<?php
// 声明参数可以是 int 或 float,返回值只能是 float
function calculateArea(int|float $width, int|float $height): float {
return (float)($width * $height);
}
echo calculateArea(10, 5.5); // 合法调用,输出 55
echo calculateArea("10", 5); // 报错!因为 string 不在声明的联合类型中
联合类型不仅让代码更严谨,还能配合 IDE 提供更精准的代码提示。这是从"弱类型脚本"向"现代强类型工程"演进的重要一步。