PHPABSTRACT怎么用?掌握这几个技巧轻松上手!

吉云

今天跟大家聊聊我最近在PHP里瞎鼓捣的abstract(抽象类),这玩意儿,一开始我也有点懵,感觉好像懂,但真要用的时候,脑子就跟浆糊一样。

事情是这样的,最近接个小项目,里面涉及到一些类的共同特性,比如都要有个getName()方法,都要能save()到数据库。但是,具体的实现又不一样,比如User类和Product类,虽然都有名字,但一个存的是用户姓名,一个存的是产品名称,存数据库的方式也肯定不一样。

PHPABSTRACT怎么用?掌握这几个技巧轻松上手!

我就是直接写一个父类,把这些共同的方法都写进去,然后子类继承。但是后来发现,这样有个问题,就是父类的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之后,代码结构清晰多,也更安全。以后再有类似的需求,我就知道该怎么做。

我这回实践主要搞明白这几点:

  • 抽象类不能被实例化,只能被继承。
  • 抽象类里可以有抽象方法和普通方法。
  • 子类必须实现抽象类里的所有抽象方法,否则会报错。

这回的经验告诉我,遇到问题还是要多查资料,多尝试,才能真正理解一个概念。而且写代码的时候,还是要多考虑代码的健壮性和可维护性,这样才能避免以后踩坑。

免责声明:由于无法甄别是否为投稿用户创作以及文章的准确性,本站尊重并保护知识产权,根据《信息网络传播权保护条例》,如我们转载的作品侵犯了您的权利,请您通知我们,请将本侵权页面网址发送邮件到qingge@88.com,深感抱歉,我们会做删除处理。

目录[+]