第十三节:PHP抽象类

PHP面向对象编程基础

PHP抽象类,定义为抽象的类不能被实例化,一个抽象类是一个只能作为父类的类。你不能从(abstract)抽象类创建一个对象。所以当你想强迫开发者扩展这个类时,可以使用这种类,而不是直接使用它。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。

PHP抽象类-如何工作

PHP抽象类-如何工作

PHP抽象类-如何工作

说我们想要我们的应用程序有两种类型的用户administrators和members,现在他们都共享一个登录功能,但他们需要的只是一点点不同。比方说,管理员登录需要加载管理员(administrator)表。所以我们可以查看哪个管理员已经登录,何时登录。另一方面,当一个会员登录时,我们需要在在线会员(member)的表中创建一个标志,以便我们可以看到哪个会员在线,哪个不在。

但除此之外,登录方法需要完全相同,所以让我们做到这一点,首先,我们打开我们的User类app/User.php,在User前面添加一个abstract关键词,将其变为抽象类,截至目前,我们不能直接从这个类创建一个对象,代码如下:

回到index.php让我们看看是否正常工作,在这里我们将把我们的变量称为peter,并使其等于一个新的Jiexi\App\User(),代码如下:

如果一切顺利,这应该抛出错误:

果然抛出错误,让我们看看Administrator类,已经扩展了User类,现在User类在底部有一个登录方法,现在只返回一条消息,说我们正在User类的登录方法……,当你创建管理员并让他登录时,然后使用父类的所有登录功能。所以这是来自抽象用户类。

然后,你可以调整它并支持抽象用户类,只需要一点点调整,在我们的例子中,我们只是说我们将此操作记录到Administrator稳定版中。 现在,让我们回到我们的index.php,而不是Jiexi\App\User我们会像这样创建一个Jiexi\App\Administrator。 而且为了更具体一点,我们将变量的名称更改为管理员。然后,我们将像这样回应管理员登录方法的输出,代码如下:
Administrator.php

index.php

在这里,你可以看到,就像预期的那样index.php输出User类的登录方法………这个登录动作使用管理员登录数据表,抽象User类后跟实际Administrator类中的逻辑。好吧?让我们快速创建一个名为member的第二个用户类型。我将在这里复制并粘贴此Administrator类,并将其重命名为Member.php。我们只需打开它,当然,类名必须是Member,我们将完全删除它,在这里,我们将只执行member特定功能,即在在线member表中设置标志,Member.php代码如下:

index.php代码如下:

刷新index.php,再次执行User的login方法,跟在后面User类的登录方法………在线会员表中设置一个标志,简单地说,abstract类有点像部分内置类。

PHP抽象类快速回顾

PHP抽象类快速回顾

PHP抽象类快速回顾

Abstract是一个关键词,你不仅可以用它来定义这个类的类型,而且你也可以用它来定义这个方法的类型,如果我用关键字abstract抽象这个公共函数的话。那么,实际的方法只是一个子类的占位符来实现的。不允许自己做任何事情,所以它不能有一个主体。

如果我们在App/user.php把public function login()改为abstract public function login(),代码如下:

访问index.php报错:

警告我们,我们正试图调用Jiexi\App\User::login()的登录方法,但它不能包含一个主体,因为它是一个抽象函数,相反,回到app/User.php,实现这个的方法是将其后面跟一个分号,然后这只是一个占位符。我把abstract public function login()的public删除,如下:

现在,回到app\Administrator.php,我们需要在我们的子类中完全定义这个方法,所以在这里,我们不能调用父类的login方法,因为这只是一个占位符,你不能直接调用它,所以我们需要做些处理:

然后在app\Member.php的Member类中:

刷新index.php会输出“…在线会员表中设置一个标志”,事实上,因为我在父类中创建了这个抽象的占位符方法,我也必须在子类中定义它,如Member.php删除看看会发生什么事情,代码如下:

刷新index.php报错:

因为abstract login方法没有定义在我们的Member子类,撤销刚才操作Member.php和User.php的代码,我们希望登录方法包含我们可以在所有子类中使用的功能。

接近10年的互联网从业经验,精通Scrum敏捷软件开发的方法,从事互联网产品设计,开发,测试,运营,案例不少于20个,发现自己最喜欢的工作是做外贸营销,外贸SEO,特别喜欢谷歌优化。从2017年3月开始坚持在群161510483直播谷歌SEO和WEB前端开发技术,只要加进来坚持学习零基础也能够学会。

Last modified: 2019年1月24日

Previous Story

PHP面向对象编程基础

第十二节:PHP子类重写父类方法

子类重写父类方法:面向对象编程中的一种语言特性方法重写,允许子类或子类提供已由其一个超类或父类提供的方法的特定实现.

...

Next Story

PHP面向对象编程基础

第十四节:PHP对象接口

对象接口:指定某个类须实现哪些方法但不要定义这些方法的内容,正如我们之前所看到的那样,对抽象类有一定的益处,这是在类之间共享可重用代码的好方法.

...