接口必须用 interface 声明,核心是契约约束而非复用;只声明 public 方法,禁用属性/构造函数;类型必须明确,避免 mixed/无声明;依赖抽象DTO而非框架类;按能力细粒度拆分接口。
接口类必须用 interface 声明,不能用 abstract class
PHP 接口的核心作用是契约约束,不是代码复用。用 abstract class 容易误塞具体实现(比如 protected 方法、属性或构造逻辑),破坏调用方对“纯行为约定”的预期。
实操建议:
-
interface中只允许声明public方法,不许有属性、构造函数、静态方法(PHP 8.1+ 允许static方法但需谨慎)、final或private修饰符 - 若需共享常量,可定义
interface并用const,但避免塞业务逻辑相关的默认值 - 多个接口组合时用
implements A, B, C,不要为“省事”而合并成一个大接口
方法签名要锁定参数类型和返回类型,尤其注意 void 和 mixed
没类型声明的接口等于没规范。调用方无法静态分析,IDE 补全失效,运行时才报错——这违背“统一调用”的初衷。
常见错误现象:
立即学习“PHP免费学习笔记(深入)”;
- 接口方法写
function handle($data),实现类却用function handle(array $data): array—— PHP 不报错但契约已断裂 - 返回类型用
mixed,导致调用方必须手动is_array()/is_object()判断,失去接口抽象价值 - 可空返回写成
?string,但实际实现可能返回null或抛异常,调用方无法预期
推荐写法:function execute(Request $request): Response,其中 Request 和 Response 是明确的 DTO 类,而非数组或 stdClass。
避免在接口中暴露框架或传输细节,比如 Illuminate\Http\Request
接口一旦依赖具体框架类,就锁死了实现方式。今天用 Laravel,明天想切到 Symfony 或 Swoole HTTP Server 就得重写全部实现,还可能引发循环依赖。