应优先选接口实现多行为契约,抽象类用于共享结构与状态。接口仅声明public abstract方法和const常量,支持多重implements;抽象类可含属性、构造函数、混合方法,但仅单继承。

如果您在设计PHP面向对象程序时,需要决定使用接口还是抽象类,则可能面临行为规范与结构继承之间的取舍。以下是区分二者的关键路径:
一、定义本质与语义定位
接口体现“能做什么”的契约性约定,抽象类体现“是什么”的结构性模板。接口仅声明公共方法签名,不携带状态或实现逻辑;抽象类可封装属性、构造函数及部分已实现方法,构成可复用的基类骨架。
1、接口使用interface关键字声明,所有方法默认为public abstract;
2、抽象类使用abstract class关键字声明,内部可混合抽象方法与具体方法;
立即学习“PHP免费学习笔记(深入)”;
3、一个类可通过implements实现多个接口,但只能通过extends继承一个抽象类;
4、接口中不允许定义private或protected方法,而抽象类中方法可自由指定访问修饰符;
5、接口无法保存对象状态,抽象类可声明protected或private成员变量。
二、构造与初始化能力差异
抽象类支持构造函数,可用于初始化共享属性或执行预设逻辑;接口不参与实例化流程,因此禁止定义构造函数,也不具备任何初始化职责。
1、抽象类中可定义__construct(),子类实例化时自动触发;
2、子类可通过parent::__construct()显式调用父类构造逻辑;
3、接口中若出现__construct声明,将导致语法错误;
4、抽象类的构造函数可接收参数并设置初始状态,接口完全不具备该能力。
三、成员变量与常量支持范围
抽象类允许定义任意访问级别的实例变量与静态变量,用于承载子类共用的状态数据;接口仅允许定义public const常量,且不可修改,不支持任何非常量属性声明。
1、抽象类中可声明protected $config = [];用于配置共享;
2、接口中仅允许const VERSION = '1.0';形式的常量定义;
3、接口中若尝试声明public $prop;或static $cache;,将引发致命错误;
4、抽象类可封装业务上下文状态,接口仅能暴露不可变的契约标识。
四、多继承与组合能力对比
PHP单继承机制限制了类对抽象类的扩展路径,但通过接口可叠加多种行为契约,实现松耦合的能力组合。
1、一个类可同时implements Loggable, Cacheable, Serializable;
2、同一类无法extends Controller, extends Model,仅能选择其一;
3、接口组合使类能精准表达多重角色,如“既是可缓存的,又是可序列化的”;
4、接口支持横向能力编织,抽象类仅支持纵向结构继承。
五、方法实现约束与强制规则
接口要求实现类必须提供全部方法的具体版本,且访问级别不得收紧;抽象类则允许子类选择性覆盖具体方法,并仅强制实现抽象方法。
1、接口中方法若声明为public function save();,实现类中不可降级为protected;
2、抽象类中若声明abstract protected function init();,子类实现时可升级为public;
3、子类未实现抽象类中全部抽象方法时,自身必须声明为abstract;
4、接口方法实现具有强契约刚性,抽象类方法实现具有弹性覆盖空间。











