今天跟大家聊聊我最近在PHP里瞎鼓捣的abstract
(抽象类),这玩意儿,一开始我也有点懵,感觉好像懂,但真要用的时候,脑子就跟浆糊一样。
事情是这样的,最近接个小项目,里面涉及到一些类的共同特性,比如都要有个getName()
方法,都要能save()
到数据库。但是,具体的实现又不一样,比如User
类和Product
类,虽然都有名字,但一个存的是用户姓名,一个存的是产品名称,存数据库的方式也肯定不一样。
我就是直接写一个父类,把这些共同的方法都写进去,然后子类继承。但是后来发现,这样有个问题,就是父类的save()
方法没法写具体,因为子类实现方式不一样!那就只能在父类里留个空方法,或者干脆抛个异常,让子类自己去实现。但是这样,万一哪个子类忘实现save()
方法,那不就完犊子?
后来我翻翻PHP的手册,看到abstract
这个关键字,这才明白,,原来还有这么个东西!这不就是专门解决我这种问题的嘛
于是我就开始动手改代码。我把父类定义成抽象类,用abstract class
。然后,把那些需要子类实现的公共方法,比如save()
,定义成抽象方法,用abstract function save();
注意,抽象方法只有声明,没有具体实现,就像一个空壳子,等着子类去填充。
改完之后,我再让子类继承这个抽象类,这下就舒服。因为PHP会强制子类必须实现抽象类里的所有抽象方法。如果哪个子类偷懒,忘实现save()
方法,PHP就会报错,告诉你“你这个类必须实现父类的抽象方法”。这下,我就不用担心哪个子类会漏掉重要的方法。
具体代码大概是这样:
定义抽象类:
abstract class Base {
abstract public function getName();
abstract public function save();
然后定义子类继承抽象类:
class User extends Base {
public function getName() {
return $this->name;
public function save() {
// 保存用户的逻辑
class Product extends Base {
public function getName() {
return $this->productName;
public function save() {
// 保存产品的逻辑
用abstract
之后,代码结构清晰多,也更安全。以后再有类似的需求,我就知道该怎么做。
我这回实践主要搞明白这几点:
- 抽象类不能被实例化,只能被继承。
- 抽象类里可以有抽象方法和普通方法。
- 子类必须实现抽象类里的所有抽象方法,否则会报错。
这回的经验告诉我,遇到问题还是要多查资料,多尝试,才能真正理解一个概念。而且写代码的时候,还是要多考虑代码的健壮性和可维护性,这样才能避免以后踩坑。