PHP接口是运行时强制契约,必须独立声明且仅含public方法声明和const常量;implements需显式写出并严格匹配签名;类型检查唯一可靠方式是instanceof。

PHP接口不是语法糖,是运行时强制契约:只要写了 interface,任何 implements 它的类就必须完整实现所有方法签名——少一个、类型不兼容、默认值缺失,都会触发 Fatal error,直接中断执行。
interface 必须独立声明,不能混用 class 或 trait
最常见错误是把接口写成 class MyInterface 或 trait LoggerInterface,PHP 解析器立刻报 Parse error: syntax error。interface 是和 class、trait 并列的一级语言结构,三者命名空间互斥。
-
interface PaymentInterface✅ 正确 -
class PaymentInterface❌ 解析失败 -
trait PaymentInterface❌ 同样报错
接口里只能放 public 方法声明和 const 常量
PHP 接口不允许属性、构造函数、普通静态方法体(PHP 8.0+ 允许声明 static function,但依然不能写实现),也不支持 default 方法(Java 那套在 PHP 里会直接解析失败)。
- 方法不写
public也默认是 public,但不能写private或protected - 可以定义
const LOG_LEVEL = 'debug';,但不能定义public $config = []; - 想复用逻辑?得用
abstract class+final方法兜底,比如建个BaseNotifier类封装通用通知前缀
implements 必须显式写出,且方法签名严格匹配
PHP 不支持鸭子类型。哪怕你类里恰好有 pay() 和 refund(),只要没写 implements PaymentInterface,$obj instanceof PaymentInterface 就是 false。
立即学习“PHP免费学习笔记(深入)”;
- 多个接口用逗号分隔:
class Alipay implements Payable, Refundable - 参数名可以不同,但类型、数量、默认值必须一致(如接口声明
pay(float $amount = 0.0),实现类不能删掉= 0.0,也不能改成int $amount) - 两个接口若都定义了同名方法但签名冲突(比如一个要
string,一个要int),PHP 编译期直接拒绝
类型检查只认 instanceof,别信 get_class()
判断对象是否符合接口规范,唯一可靠方式是 $obj instanceof Notifiable。用 get_class($obj) 只能拿到类名,完全无法反映它实现了哪些接口——哪怕它实现了十个,get_class() 也只返回一个字符串。
接口方法签名一旦发布,修改成本极高:加参数、改类型、删方法,都会导致所有实现类报错。所以定义时就要想清楚粒度——比如拆成 UserRegistrationInterface、UserLoginInterface,而不是塞进一个大而全的 UserInterface 里。



















