PHP 8.1 不存在“Pure接口函数”概念,接口仅用于类型约束和契约定义,不可直接调用;所谓“纯接口”仅指仅含抽象方法的传统接口,与交集类型或纯枚举无关。

PHP 8.1 没有“Pure接口函数”这个语言概念,也没有专门的调用语法——接口本身不能被“调用”,只能被实现、被类型约束、被实例检查。
为什么你搜不到 Pure interface function?
PHP 的 interface 是契约定义,不是可执行单元。所谓“Pure接口”,通常指不含静态方法、不带常量、仅声明抽象方法的接口(即传统意义的“纯接口”),但它和 PHP 8.1 的 Pure intersection types 无关,也和 Pure enum 的“pure”语义不同——后者指无 backing value,前者只是风格描述。
- PHP 不支持接口方法的直接调用,如
MyInterface::doSomething()会报Fatal error: Uncaught Error: Call to undefined method -
abstract class可以有具体方法,interface在 PHP 8.1 仍只允许public抽象方法(含默认实现的default方法是 Java/C# 概念,PHP 不支持) - 如果你看到“Pure interface function”出现在某文档或错误里,大概率是作者误用术语,实际想表达的是“仅由接口类型约束的函数参数”或“交集类型中使用的纯接口”
你真正需要的:用接口做类型提示 + 实际调用对象方法
所谓“调用 Pure 接口”,本质是传入一个同时满足多个接口的对象,再调用其已实现的方法。PHP 8.1 的交集类型让这事更明确:
interface HasId { public function getId(): int; }
interface HasTitle { public function getTitle(): string; }
<p>function renderCard(HasId & HasTitle $item): string {
return "<div>#{$item->getId()}: {$item->getTitle()}</div>";
}</p><p>// ✅ 正确:传入同时实现两个接口的实例
class BlogPost implements HasId, HasTitle {
public function getId(): int { return 123; }
public function getTitle(): string { return "PHP 8.1 交集类型"; }
}
echo renderCard(new BlogPost()); // 输出正常</p><p>// ❌ 错误:只实现一个接口
class SimpleUser implements HasId { /<em> ... </em>/ }
renderCard(new SimpleUser()); // TypeError: Argument 1 must be of type HasId & HasTitle- 交集类型
HasId & HasTitle不要求接口本身“纯净”,只要求实参对象同时具备这两个契约 - 函数体内调用的是对象方法(
$item->getId()),不是接口方法;接口只起编译期校验作用 - 如果接口方法签名冲突(比如两个接口都声明
run(string $x)和run(int $x)),PHP 会在opcache编译阶段报ParseError,而非运行时报错
常见误操作与报错排查
遇到类似“cannot call interface method”或“must implement interface”的错误,基本不是语法问题,而是对象没落实契约:
立即学习“PHP免费学习笔记(深入)”;
-
TypeError: Argument #1 ($obj) must be of type A & B, C given→ 检查C类是否implements A, B,且所有方法签名完全一致(包括返回类型、参数类型、是否引用) -
Call to undefined method A::xxx()→ 你试图在接口名后加::直接调用,这是非法的;必须通过具体对象实例调用 - 使用
instanceof判断时写成$obj instanceof MyInterface是合法的,但注意:PHP 8.1+ 所有枚举自动实现\UnitEnum,而接口不自动实现任何东西——它只是类型占位符 - 别把
interface和trait混用:trait 提供复用逻辑,interface 约束行为,二者定位完全不同
最易忽略的一点:交集类型校验发生在编译期,但方法调用失败(比如未实现某方法)是运行期错误,而且错误信息不会提示“缺哪个接口的方法”,只会说“call to undefined method”。所以写完 implements A & B 后,务必逐个核对方法签名是否真能共存。



















