第4页 / 共40页

变量与数据类型

变量是存储数据的容器,数据类型决定了容器中能放什么样的数据。本页深入探讨 PHP 变量的声明规则、弱类型特性,以及八大基础数据类型的细节。

一、变量的声明与使用

在 PHP 中,变量以美元符号 $ 开头,后面跟着变量名。PHP 是一门弱类型语言,这意味着你在声明变量时不需要指定它的数据类型,PHP 引擎会根据你赋给它的值自动推断类型。

<?php $siteName = "惜梦PHP"; // 自动推断为 string 类型 $year = 2024; // 自动推断为 int 类型 $pi = 3.14159; // 自动推断为 float 类型 $isOpenSource = true; // 自动推断为 bool 类型 echo $siteName; // 输出:惜梦PHP

变量命名规则

驼峰命名法是 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 (布尔型) 表示真假,只有两个值:truefalse (不区分大小写)。
复合类型
(多值)
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 提供更精准的代码提示。这是从"弱类型脚本"向"现代强类型工程"演进的重要一步。