PHP抽象类 介绍
前言抽象类abstract class在 PHP 里是一个折中产物它一半是契约、一半是实现。用abstract修饰的类不能被实例化它可以包含没有方法体的抽象方法强制子类去实现也可以包含完整实现的普通方法供所有子类直接使用。关于它的误解集中在三点「抽象类里的方法必须全是抽象的」——不对。抽象类完全可以没有抽象方法一个方法都不抽象也是合法的此时abstract的作用只是「禁止直接new它」。「抽象类不能有构造器、不能有属性」——不对。抽象类可以有属性、常量、构造器、静态方法几乎所有普通类能有的它都有只差「不能被new」这一条。「抽象类和接口是二选一的对立面」——不准确。两者常常同时使用抽象类implements一个接口把接口里的一部分方法实现掉剩下的留给具体子类。本文按「语法限制 → 与接口的取舍 → 典型用法 → 实战代码」的顺序展开所有结论以 PHP 8 的语义为准。一、abstract的确切语法含义abstract可以用在两个位置修饰类abstract class Foo { }。唯一的效果是禁止new Foo()直接实例化会抛Error: Cannot instantiate abstract class Foo。修饰方法abstract public function area(): float;。它必须以分号结尾不能有方法体。子类必须实现它否则子类也得声明为abstract。几条硬性规则规则违反时的结果抽象方法不能是private致命错误Abstract function X::y() cannot be declared private含有抽象方法的类必须声明为abstract致命错误类含抽象方法必须声明为抽象或实现剩余方法抽象方法不能有方法体语法解析错误抽象类不能被final修饰致命错误abstract与final互相矛盾抽象类不能被newError: Cannot instantiate abstract class Xabstract方法最常见的是public和protected。用protected的场合是这个方法只是父类流程里的一个步骤不打算作为对外 API 暴露只希望子类去填实现。二、抽象类与接口的取舍这是初学者最容易卡住的地方。两者都能定义「必须被实现的方法」但限制完全不同特性抽象类接口属性可以有不能有只能有常量常量可以有可以有具体方法有方法体可以有不能有抽象方法可以有也可以一个都没有全部方法都是声明方法可见性public/protected只能是public一个类能继承/实现几个只能extends一个类implements可以列多个能否被new不能不能语义is-a是什么can-do能做什么选择标准一句话概括需要保存状态或提供公共实现就用抽象类只需要一份契约、而且一个类可能要满足多份契约就用接口。两者不是替代关系——一个类可以extends一个抽象类同时implements多个接口。抽象类还可以「部分实现」一个接口声明implements却只实现一部分方法剩下的抽象方法留给子类。这在框架里非常常见。三、典型用法模板方法抽象类最有价值的用法是模板方法Template Method把算法骨架放在父类把可变的步骤声明成抽象方法交给子类。?php // 适用于 PHP 8.1declare(strict_types1);abstract class Shape{public function __construct(protected readonly string $name){}// 抽象方法只给契约不给实现abstract public function area(): float;// 具体方法所有子类共用描述逻辑public function describe(): string{return sprintf(%s 的面积是 %.2f, $this-name, $this-area());}// 具体方法内部调用抽象方法构成「骨架」public function scaledArea(float $factor): float{if ($factor 0) {throw new InvalidArgumentException(缩放系数必须为正);}return $this-area() * $factor;}}final class Circle extends Shape{public function __construct(private readonly float $radius){parent::__construct(圆);}public function area(): float{return M_PI * $this-radius ** 2;}}final class Rect extends Shape{public function __construct(private readonly float $width,private readonly float $height,) {parent::__construct(矩形);}public function area(): float{return $this-width * $this-height;}}foreach ([new Circle(1.0), new Rect(3.0, 4.0)] as $shape) {echo $shape-describe(), PHP_EOL;}三点值得注意Circle和Rect的构造器里必须先parent::__construct(圆)把$name交给父类。因为子类自己定义了构造器父类构造器不会自动执行。describe()和scaledArea()是父类写死的骨架子类一行都不用重复它们调用$this-area()时会动态分派到子类的实现——这正是抽象类带来多态的路径。子类实现抽象方法时可见性必须与父类相同或更宽。父类写protected function foo()子类不能写成private。如果目标是 PHP 7.x把两块改掉即可构造器属性提升要展开成显式赋值readonly需要去掉并配上 getter 方法。四、不需要抽象方法也可以抽象一个常见的确认性问题抽象类里一个抽象方法都没有有意义吗有。下面两种场景都用得上?php // 适用于 PHP 7.1用到了 void 返回类型abstract class BaseController{protected function json(array $data, int $status 200): void{http_response_code($status);header(Content-Type: application/json; charsetutf-8);echo json_encode($data, JSON_UNESCAPED_UNICODE);}}它的用途是「强制通过继承来使用」调用方必须写一个具体的子类而不能直接new BaseController()。这在框架里用来禁止某一层被绕过。另一种是「延迟实现接口」抽象类声明implements一个接口只实现其中一部分方法剩下的留给子类。这样多个子类共享已实现的部分只在差异处各写各的。常见坑点❌ 在抽象类里调用还没有初始化完成的子类状态例如在父类构造器里调用抽象方法—— ✅ 此时子类的构造逻辑还没跑完属性可能未初始化构造器里只做不依赖子类实现的基础初始化。❌ 把抽象方法声明成private—— ✅ 致命错误抽象方法只能是public或protected因为子类必须能看见它。❌ 子类只实现了一部分抽象方法 —— ✅ 未实现完的子类自己也必须声明为abstract否则报致命错误。❌ 在非抽象类里写抽象方法 —— ✅ 报致命错误提示该类含抽象方法、必须声明为抽象或实现剩余方法。❌ 子类实现抽象方法时把可见性收窄父类public改成子类protected—— ✅ 致命错误实现时可见性只能相同或更宽。❌ 给抽象方法写上方法体 —— ✅ 语法错误抽象方法必须用分号结尾、没有花括号。❌ 想new一个抽象类来「临时用一下」—— ✅ 抛Error: Cannot instantiate abstract class先写一个具体子类。❌ 给抽象类加final—— ✅ 两者语义互斥PHP 会直接报致命错误要禁止继承就用final class但那样它就不能有未实现的抽象方法。总结要点说明abstract class不能被new可有属性、常量、构造器、具体方法abstract function无方法体以分号结尾子类必须实现可见性抽象方法只能是public/protected不能private实现要求全部抽象方法实现完子类才可以是具体类与接口的区别抽象类有属性、有实现、只能继承一个接口只有契约、可实现多个典型模式模板方法、延迟实现接口、强制通过继承使用结论把抽象类理解成「一个没写完的类」最贴切——它已经写好的部分被子类共享没写完的部分由子类填。设计时先问自己两句话这份逻辑需要保存状态吗需要就用抽象类这个契约有多个类要同时满足吗需要就再抽一个接口两者叠加使用就能既有共享实现、又保留多契约的灵活性。

相关新闻

农水人写毕业论文别硬扛!从灌区试验到降重,这套AI组合帮你少熬大夜 [特殊字符]

农水人写毕业论文别硬扛!从灌区试验到降重,这套AI组合帮你少熬大夜 [特殊字符]

学农业水利工程的同学应该都懂,咱们的毕业论文很少是纯“坐图书馆查资料”就能写完的。比如很多同学会做这样一个题目:河套灌区玉米膜下滴灌条件下土壤水盐运移规律及作物响应研究。 你可能要布置田间试验,监测土壤含水率、电导率、地下水位&…

2026/10/10 2:06:50 阅读更多 →
英语写作批改工具怎么挑?2026年最新这5款别踩坑

英语写作批改工具怎么挑?2026年最新这5款别踩坑

英语写作批改这个事,我做了五年多,见过太多人踩坑了。有些老师兴冲冲买了个工具,用两周就扔一边,钱白花。也有人图便宜用免费的,结果批出来的东西还得自己重改一遍,反倒更累。选工具这件事,真不…

2026/10/10 2:06:50 阅读更多 →
OpenClaw + RK3576M 新媒体自动化实战:内容流水线搭建全流程

OpenClaw + RK3576M 新媒体自动化实战:内容流水线搭建全流程

2026 年,AI Agent 行业最大的尴尬,从来不是「能不能做出来 Demo」,而是「能不能落地到真实业务里」。市面上 90% 的 AI Agent 教程,都只停留在 Prompt 优化、工具链拼接的软件层面,却绝口不提一个核心事实:…

2026/10/10 2:05:50 阅读更多 →

最新新闻

同城跑腿系统:骑手端同步和下单收款怎么拆

同城跑腿系统:骑手端同步和下单收款怎么拆

同城跑腿系统联调时,常见做法是支付一通就对外宣称上线。更稳的做法是把「下单与订单状态」和「收款回调」拆阶段验收:前者不依赖真实通道,后者用沙箱 profile,避免支付未过却改订单写入口。结论 订单状态推进应由领域事件驱动&am…

2026/10/10 2:56:07 阅读更多 →
TwinCAT3.1.4026 C++使用入门

TwinCAT3.1.4026 C++使用入门

TwinCAT C使用入门1、准备工作1.1 软件环境1.2 硬件环境2、安装流程2.1 Visual Studio安装2.2 TwinCAT 安装3、配置签名3.1 TwinCAT证书制作3.2 Windows开启测试模式4、C项目设置4.1 项目编译4.2 模块加载执行1、准备工作 1.1 软件环境 TwinCAT Package Manager; …

2026/10/10 2:56:07 阅读更多 →
LikeShop 购物车模块深度优化:登录态合并、商品失效与批量结算二开

LikeShop 购物车模块深度优化:登录态合并、商品失效与批量结算二开

一、原生购物车体系数据表拆解1.1 购物车表(ls_cart)LikeShop 的购物车数据存储在 ls_cart 表中,表结构简洁,核心字段如下:字段名数据类型注释idint主键user_idint用户idgoods_idint商品idgoods_numsmallint购买数量it…

2026/10/10 2:56:07 阅读更多 →
Flink 2.3.0 从理论到实践 —— 第 4 章 状态管理(State)

Flink 2.3.0 从理论到实践 —— 第 4 章 状态管理(State)

Flink 2.3.0 从理论到实践 —— 第 4 章 状态管理(State) 课程定位:状态是 Flink 区别于普通流处理引擎的核心能力。本章深入 Keyed State 与 Operator State 的区别、三种状态后端(HashMap / ForSt / RocksDB)、状态 …

2026/10/10 2:56:07 阅读更多 →
1.两数之和 - 力扣(Leetcode)

1.两数之和 - 力扣(Leetcode)

题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 你可以按任意顺序返回答案。 示例…

2026/10/10 2:56:07 阅读更多 →
基于PCA9422 PMIC与STM32F401RB的锂电池供电与低功耗电源管理实战

基于PCA9422 PMIC与STM32F401RB的锂电池供电与低功耗电源管理实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 2:55:07 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →