← PHP魔术常量:会“变脸”的预定义常量 PHP运算符全解:从基础运算到执行优先级 →

PHP数据类型:从松散类型到精准掌控

原创 2026-05-09 PHP 已有人查阅

PHP作为一门松散类型的编程语言,给开发者提供了极大的便利——声明变量时,你不需要像Java或C那样预先指定数据类型。PHP会在运行时根据你赋给变量的值,自动判定它的类型。这种机制让PHP代码写起来很流畅,但也正是因为它不强制类型声明,理解PHP底层到底有哪些数据类型、各自有什么特性,就成了写出健壮代码的基础功。

PHP原生支持8种基本数据类型,按性质可以归纳为三大类:标量类型、复合类型和特殊类型。下面我们分别拆解。

三大类型分类速览

类型分类 特点 具体包含
标量类型 只能存储一个单一值 布尔型、整型、浮点型、字符串型
复合类型 可以存储多个值或结构 数组、对象
特殊类型 PHP里比较特别的两种类型 资源、NULL

标量类型是PHP预定义好的,拿来就用;复合类型通常由开发者自行构造;特殊类型则服务于特定的底层场景。下面逐个深入说明。

一、标量类型(Scalar Types)

标量类型是最基础的数据类型,一个变量只能持有一个值。PHP中有4种标量类型。

1. 布尔型(Boolean)

布尔型像个开关,只有两种状态:TRUE(真)和FALSE(假),不区分大小写。它几乎是所有条件判断、循环控制的基石。

示例:

<?php
$isLoggedIn = true;
$hasPermission = false;

if ($isLoggedIn && $hasPermission) {
    echo "欢迎进入管理后台";
} else {
    echo "请先登录或联系管理员开通权限";
}
// 输出:请先登录或联系管理员开通权限
?>

个人经验分享:很多初学者容易把空字符串''、数字0、字符串'0'NULL直接当做布尔型的假值来用,这在宽松比较(==)时通常没问题,但一旦切换到严格比较(===),就会出问题。我个人习惯在涉及布尔判断的变量命名时,都用ishascan这类前缀,让变量的布尔性质一目了然,降低后面阅读代码的认知成本。

2. 整型(Integer)

整型就是不带小数点的数字,可以是正数,也可以是负数。PHP的整型遵循几个规则:

  • 可以写成十进制、八进制(以0开头)、十六进制(以0x开头)

  • 不能包含小数点

  • 在32位系统上,范围大约是 -21亿 到 21亿;64位系统上则大得多

示例:

<?php
$studentCount = 58;          // 十进制
$permissionCode = 0755;     // 八进制,实际十进制值是493
$colorRed = 0xFF0000;       // 十六进制,实际十进制值是16711680

echo "学生人数:" . $studentCount . "\n";
echo "权限码(十进制):" . $permissionCode . "\n";
// 输出时PHP会自动转为十进制显示
?>

本节课程知识要点:在进行数据库主键、金额计算(单位用分)、循环计数等场景时,明确用整型可以避免浮点型带来的精度问题。尤其是涉及金额,不要让浮点数参与计算,用整型存“分”是最稳妥的选择。

3. 浮点型(Float)

浮点型也叫双精度数,就是带小数点的数字。科学记数法也算浮点数。

示例:

<?php
$productPrice = 39.90;
$pi = 3.1415926;

// 计算总价
$quantity = 3;
$total = $productPrice * $quantity;
echo "三件商品总价:" . $total;
// 输出:三件商品总价:119.7
?>

个人见解:浮点数在底层是用二进制近似表示的,所以做相等判断时经常会踩坑。比如0.1 + 0.2 == 0.3在PHP里结果是false。这不是PHP的毛病,而是IEEE 754浮点标准的特性。如果必须比较两个浮点数,用一个非常小的差值(比如0.00001)来判断它们是否“近似相等”,或者直接转向用整型处理,是我在所有项目里坚持的做法。

4. 字符串型(String)

字符串用来存放文字内容,可以包含字母、数字、符号甚至二进制数据。字符串可以用单引号或双引号包裹,但两者的解析行为不同。

示例:

<?php
$siteName = "代码号学习编程";

// 双引号会解析变量
echo "欢迎来到 {$siteName} 网站\n";
// 输出:欢迎来到 代码号学习编程 网站

// 单引号原样输出
echo '欢迎来到 {$siteName} 网站\n';
// 输出:欢迎来到 {$siteName} 网站\n
?>

为什么用单引号而不用双引号:如果字符串里没有变量需要解析,单引号的执行效率比双引号略高,因为PHP不需要去扫描字符串内部是否有变量。在大循环或高频调用的地方,这种微小差异会累积成可感知的性能差别。可读性的优先级更高,不要为了省这点性能牺牲代码清晰度。

二、复合类型(Compound Types)

复合类型可以容纳多个值,由开发者根据业务需要来构建。

1. 数组(Array)

数组是PHP里最常用的复合类型,可以在一个变量里存放多个值,并且这些值甚至可以是不同类型。

示例:

<?php
$tools = array("VSCode", "PhpStorm", "Docker");
// 也可以用短数组语法(PHP 5.4+)
$tools = ["VSCode", "PhpStorm", "Docker"];

echo "我常用的开发工具有:" . $tools[0] . "、" . $tools[1] . "和" . $tools[2];
// 输出:我常用的开发工具有:VSCode、PhpStorm和Docker
?>

数组在PHP里的地位极高,几乎所有数据都靠它承载。后面会有专门的章节详细讲关联数组、多维数组以及各种数组函数,这里先建立基本概念。

2. 对象(Object)

对象是类的实例化产物,它可以同时容纳数据(属性)和行为(方法)。与数组不同,对象有明确的结构定义。

示例:

<?php
class Course {
    public $title;
    public $duration; // 单位:小时

    function info() {
        return "课程:《{$this->title}》,时长:{$this->duration}小时";
    }
}

$phpCourse = new Course();
$phpCourse->title = "PHP从基础到实战";
$phpCourse->duration = 32;

echo $phpCourse->info();
// 输出:课程:《PHP从基础到实战》,时长:32小时
?>

个人建议:当数据不只是简单的键值对,而是附带了一堆相关的操作逻辑时,就应该用对象而不是数组。比如一个“订单”,它有关联的计算总价方法、状态变更方法,用对象封装起来,代码的自治性和可维护性会明显提升。我见过不少老项目把一切扔进数组传来传去,之后谁也搞不清数组里到底有哪些键,重构起来苦不堪言。

三、特殊类型(Special Types)

这两个类型不属于常规的数据存储范畴,但PHP把它们单独列为类型。

1. 资源(Resource)

资源不是一个真正的数据类型,它是一个指向外部资源(如数据库连接、文件句柄、图像画布等)的引用标识符。你无法直接操作资源变量里的内容,只能通过专门的函数来使用它。

<?php
$fileHandle = fopen("data.txt", "r");
// $fileHandle 就是一个资源类型
var_dump($fileHandle);
// 用完后记得关闭
fclose($fileHandle);
?>

资源类型本质上是PHP对系统底层句柄的一层封装,我们后面在讲文件操作和数据库操作时会频繁接触它。

2. NULL

NULL表示变量没有值,它是大小写不敏感的,但习惯上写成大写。以下三种情况变量会是NULL:

  • 直接赋值NULL

  • 变量已声明但从未赋值

  • 变量被unset()销毁后

示例:

<?php
$result = null;
var_dump($result); // 输出:NULL

$notSet;
var_dump($notSet); // 虽然会报Warning,但值也是NULL
?>

本节课程知识要点:在做数据库查询时,如果某字段允许为空,取回来的值就是null。这时如果用字符串函数直接操作它,PHP 8以上会抛出TypeError异常。所以养成在操作前用is_null()=== null做判断的习惯,能避免不少运行时错误。

用var_dump()快速查看类型

在开发中,不确定某个变量到底是什么类型时,var_dump()是最直接的调试工具,它会同时输出变量的类型和值。

<?php
$testCases = [10.0, 100, true, "test", null];
foreach ($testCases as $case) {
    var_dump($case);
    echo "\n";
}
/* 输出:
float(10)
int(100)
bool(true)
string(4) "test"
NULL
*/
?>

建议在调试阶段把这个函数用熟,它比echo更适合排查类型相关的问题。

以上内容覆盖了PHP 8种基本数据类型的概念、示例和项目开发中的注意事项。牢固掌握这些基础,后续学习数组高级操作、面向对象编程、数据库交互等进阶主题时,才能理解得更透彻。

← PHP魔术常量:会“变脸”的预定义常量 PHP运算符全解:从基础运算到执行优先级 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号