交集类型(A & B)要求同时满足A和B,仅限对象类型且不支持标量或void;联合类型(A | B)只需满足其一,用于多态输入;&优先级高于|,但二者不可混用。

交集类型(A & B)要求“必须同时满足”
参数或返回值得是 A 类型 且 是 B 类型——两个接口/类的契约都得兑现。比如 <code>LoggerInterface & Serializable,对象既要能打日志,又要能序列化,缺一不可。PHP 运行时会直接报 Fatal error: Uncaught TypeError,不给绕过去的机会。
联合类型(A | B)表示“满足其一即可”
传 A 或 B 都合法,运行时不强制要求两者兼备。例如 string|int 允许传 "hello" 或 42,函数内部得自己判断分支逻辑。它解决的是“多态输入”,不是“复合能力”。
语法优先级和混合使用要小心
& 的优先级高于 |,所以 A & B | C 等价于 (A & B) | C,不是 A & (B | C)。这种写法本身在 PHP 8.1 是非法的——交集类型里不能嵌套联合类型,反之亦然。你只能写 A & B 或 C | D,不能混在同一个类型位置。
哪些类型能参与交集?限制很明确
交集只接受对象类型:
立即学习“PHP免费学习笔记(深入)”;
-
interface & interface✅(如Iterator & Countable) -
class & interface✅(但class必须放在左边,如ArrayObject & JsonSerializable) -
string & int❌(标量类型禁止) -
array | Traversable❌(交集里不能出现|) -
void & object❌(void不参与交集)
最容易被忽略的是:交集类型不提供“自动实现推导”——即使某个类实现了全部接口,你也得显式声明 A & B,否则类型检查不会触发。它只校验,不补全。



















