PHP8 的标量类型有哪些?列举并给出示例

解读

国内大厂一面常把“PHP8 标量类型”作为基础筛人题,考察两点:

  1. 是否真正区分“标量”与“复合/特殊”类型;
  2. 能否用 PHP8 新语法(联合类型、命名参数、match 表达式)现场写安全、可跑的代码。
    面试官通常会让你“手写 3 行代码证明”,如果写成 arrayclass 直接扣分;若把 falsetrue 当成独立标量却说不清原因,也会被认为“只背八股”。因此答案必须“列官方 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

注意:

  1. false 与 null 在 PHP8 才被允许单独写在类型声明里,属于“小标量”;
  2. 严格模式下(strict_types=1)传参或返回若类型不符,会抛 TypeError,面试时务必加上;
  3. 联合类型里 |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

拓展思考

  1. 为什么 PHP8 才把 false 独立成类型?
    答:以前只能用“假返回”约定,无法通过类型系统强制检查;PHP8 引入联合类型后,把 false 视为“单位类型”可让静态分析器(Psalm、PHPStan)发现“忘记判断假返回”的 bug,国内字节、阿里代码库已强制 @psalm-trace 检查。

  2. 面试追问:float 和 int 在协变/逆变里的规则?
    答:参数类型“逆变”不允许把 float 换成 int;返回类型“协变”允许把 int 换成 float;因为 float 范围大于 int,符合里氏替换原则。

  3. 实战陷阱:
    function f(int $v): void {} 传入 '8' 会抛 TypeError,即使字符串是数字;而在弱类型文件(无 declare)里会隐式转换。国内金融支付接口必须开 strict_types,避免 0 与 '0' 混用造成资损。