PHP8 的标量类型有哪些?列举并给出示例
解读
国内大厂一面常把“PHP8 标量类型”作为基础筛人题,考察两点:
- 是否真正区分“标量”与“复合/特殊”类型;
- 能否用 PHP8 新语法(联合类型、命名参数、match 表达式)现场写安全、可跑的代码。
面试官通常会让你“手写 3 行代码证明”,如果写成array或class直接扣分;若把false与true当成独立标量却说不清原因,也会被认为“只背八股”。因此答案必须“列官方 4 大标量 + PHP8 新增 2 小标量”,并给出带declare(strict_types=1);的可复制示例,体现工程级严谨。
知识点
PHP 手册把类型分为三大类:
- 标量(scalar):bool、int、float、string、PHP8 新增 false、null
- 复合(compound):array、object、callable、iterable
- 特殊(special):resource、mixed、never、void
注意:
- false 与 null 在 PHP8 才被允许单独写在类型声明里,属于“小标量”;
- 严格模式下(
strict_types=1)传参或返回若类型不符,会抛TypeError,面试时务必加上; - 联合类型里
|false常见于“失败返回假”的 C 风格 API,而 `|null”表示可空;两者不能互换。
答案
PHP8 共有 6 种标量类型:bool、int、float、string、false、null。
现场可手写的完整示例:
<?php
declare(strict_types=1);
function payAmount(float $amount, bool $isVip): string|false
{
if ($amount <= 0) {
return false; // 标量 false
}
return $isVip ? '88.8' : '99.9';
}
var_dump(payAmount(100.0, true)); // string(4) "88.8"
var_dump(payAmount(-5, false)); // bool(false)
补充演示 int、null 用法:
function nextId(?int $lastId): int|null
{
return $lastId === null ? null : $lastId + 1;
}
var_dump(nextId(100)); // int(101)
var_dump(nextId(null)); // NULL
拓展思考
-
为什么 PHP8 才把 false 独立成类型?
答:以前只能用“假返回”约定,无法通过类型系统强制检查;PHP8 引入联合类型后,把 false 视为“单位类型”可让静态分析器(Psalm、PHPStan)发现“忘记判断假返回”的 bug,国内字节、阿里代码库已强制@psalm-trace检查。 -
面试追问:float 和 int 在协变/逆变里的规则?
答:参数类型“逆变”不允许把 float 换成 int;返回类型“协变”允许把 int 换成 float;因为 float 范围大于 int,符合里氏替换原则。 -
实战陷阱:
function f(int $v): void {}传入'8'会抛 TypeError,即使字符串是数字;而在弱类型文件(无 declare)里会隐式转换。国内金融支付接口必须开 strict_types,避免 0 与 '0' 混用造成资损。