php抽象类必须用abstract关键字声明,否则含抽象方法会报错;可含构造函数、属性和普通方法,但不能实例化;抽象方法需子类用public或protected实现,且不可为private。

PHP抽象类必须用abstract关键字声明
不加abstract,哪怕类里有abstract方法,PHP也会直接报错:PHP Fatal error: Class contains abstract method and must therefore be declared abstract。反过来,如果类声明了abstract,但里面全是普通方法,也能通过——只是失去了抽象类的意义。
实操建议:
-
abstract必须放在class前,顺序不能颠倒:abstract class Animal { ... }✔️;class abstract Animal { ... }❌ - 抽象类不能被
new实例化:new Animal()会触发Fatal error: Cannot instantiate abstract class - 抽象类可以有构造方法、属性、普通方法、静态方法,和普通类一样——只是它存在的目的不是被直接用,而是被继承
抽象方法必须在子类中用public或protected实现
抽象方法只定义签名,不写函数体(结尾是分号,不是花括号),子类必须覆写它,且可见性不能比父类更严格。常见错误是子类用了private,或者忘了加public(PHP默认public,但抽象方法声明时没写,子类实现时漏掉就容易出问题)。
示例对比:
立即学习“PHP免费学习笔记(深入)”;
abstract class Logger {
abstract public function write($message);
}
class FileLogger extends Logger {
public function write($message) { // 必须是 public(或 protected),不能是 private
file_put_contents('app.log', $message . PHP_EOL, FILE_APPEND);
}
}
注意:write()在子类里如果写成private function write(),运行时报PHP Fatal error: Access level to FileLogger::write() must be public。
Sylius开源电子商务平台是一个开源的 PHP 电子商务网站框架,基于 Symfony 和 Doctrine 构建,为用户量身定制解决方案。可管理任意复杂的产品和分类,每个产品可以设置不同的税率,支持多种配送方法,集成 Omnipay 在线支付。功能特点:前后端分离Sylius 带有一个强大的 REST API,可以自定义并与您选择的前端或您的微服务架构很好地配合使用。如果您是 Symfony
抽象类可以包含非抽象方法,且会被子类自动继承
这点常被忽略:抽象类不是“只能写抽象方法”。比如通用日志格式封装、参数校验逻辑、工具函数,都适合放在抽象类里,子类直接调用,不用重复写。
典型场景:
- 多个支付渠道(
AlipayGateway、WechatGateway)继承同一个abstract PaymentGateway,其中validateOrderData()是公共校验逻辑,用普通方法写;而pay()和refund()是抽象方法,由子类各自实现 - 抽象类里的
protected方法可被子类调用,private则不行——这点和普通继承完全一致 - 如果抽象类定义了
__construct(),子类__construct()中需显式调用parent::__construct(),否则父类初始化逻辑不会执行
抽象类与接口的关键区别:不能多继承,但可带状态
PHP不支持类多重继承,所以一个类只能extends一个抽象类,但可以implements多个接口。这意味着:如果需要共享字段(如$timeout、$retries)、构造逻辑或部分实现,抽象类更合适;如果只是约定行为契约(比如canFly()、canSwim()),接口更灵活。
容易踩的坑:
- 误以为抽象类能替代接口——结果发现子类还需要实现另一套行为,又得额外
implements接口,反而更重 - 在抽象类里塞太多业务逻辑,导致子类被迫继承一堆用不到的方法,违反“单一职责”
- 抽象类的
static属性/方法会被所有子类共享,不是各自一份——这点和普通类一致,但初学者容易当成“每个子类独立副本”
抽象类不是语法糖,它是设计意图的显式表达:这里有一组相关类,它们有共同骨架,也有必须差异化实现的部分。写的时候多问一句——这个逻辑,是不是所有子类都该有一份?如果不是,它就不该放进来。










