第十四节:PHP对象接口

Last Updated on

最后更新: 2019-01-25 10:22 下午

对象接口,可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。正如我们之前所看到的那样,对抽象类有一定的益处,这是在类之间共享可重用代码的好方法,可重用代码是很好的,因为它可以避免创建重复代码。接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。

对象接口-简要概述

接口中定义的所有方法都必须是公有,这是接口的特性。可以这么去理解一个接口基本上是一个合同,接口会告诉你在每个遵守该合同的类中应该出现哪些方法。对象接口是一个很好的工具,可以帮助你将你的类与其他应用程序分开。这就是面向对象编程的真正力量所在!

我想在我们的Jiexi应用程序中显示Posts,这些Posts必须存储在某个仓库的某个地方,例如数据库,rss feed,或者php数组,Jiexi应用程序不必担心这些posts来自哪里或者他们如何被检索,数据仓库像一个黑匣子,只需输入一些参数,它将返回一个响应。应用程序的其余部分并不知道黑匣子里面发生了什么,这很好,因为我们可以根据需要更改黑匣子里面的工作。只要它可以输入相同的参数,并收到相同类型的响应,我们的应用程序不会中断,这就是这个合同的目的。

对象接口-实例演示

对象接口-实例演示

对象接口-实例演示

在App文件夹下面创建一个Repositories文件夹,有两个文件分别是posts.json和posts.xml:

posts.json

posts.xml

在Repositories文件夹,我们创建数据处理类PostRepositoryInterface.php,现在我们所有的接口需要做的是指定应用程序哪些方法能够使用,当处理一个类的时候,实现这个接口,使用implements操作符。首先我们需要设置一个namespace是Jiexi\App\Repositories,然后我们再创建一个接口:

现在让我们返回到index.php:

浏览器访问index.php报错:

如果你没有定义合约里面所有的方法,就会报错,我们JSON类需要在我们的interface定义这两种方法,事实上这些方法甚至需要接受与合同中相同的参数。

下一步采取这两种方法并定义PostJsonRepository.php它们,创建一个公共函数叫All和Find,find要用$id参数,我们还需要在这些方法中写一些逻辑代码,这个文件叫postjsonrepository,我们将专门处理post.json数据文件,我们将构建post,post接口的实现,它将处理从post.xml数据文件中获取数据,创建__construct构造函数,设置路径到posts.json.

PostJsonRepository.php

让我们回到index.php输出postRepository:

输出结果如下:

非常接近了,这是数组中包含数组,我们想要有一个对象的数组,让我们来修改,最简单的创建数组方法,遍历这个multi-dimensional数组,让我们在PostJsonRepository.php做代码修改:

像上述修改应该给我们一个对象的数组,回到index.php让我们看看我们所要求:

正是我们想要的输出结果,让我们继续整理代码,回到index.php把值存到$posts:

刷新index.php输出结果如下:

从上面输出结果来看我们需要单一显示2的,看起来有点问题,应该是出在PostJsonRepository.php的$this->posts[] = (object) $post上面,因为我开始一个新数组,当然我们应该传递一个键,代码做如下修改:

接下来我们要展示posts.xml的内容,创建一个PostRssRepository.php并把PostJsonRepository.php的代码复制过来做修改,首先把posts.json修改为Post.xml,把__construct的file_get_contents改为simplexml_load_file,删除第二个参数,代码如下:

回到index.php修改代码:

刷新index.php返回结果:

PostJsonRepository输出结果

PostJsonRepository输出结果

如果从数据库中读取,那么我们创建一个PostDatabaseRepository.php,代码大概如下:

让我们回顾,对象接口是一个很好的工具,可以帮助你将类与其他应用程序分开,这就是面向对象编程的真正力量所在!
下载本课完整源码

Last modified: 2019年1月25日

前一篇

PHP面向对象编程基础

第十三节:PHP抽象类

PHP抽象类:抽象类不能被实例化一个抽象类是只能作为父类的类,所以当你想强迫开发者扩展这个类时,可以使用这种类,而不是直接使用它.

...

后一篇

PHP面向对象编程基础

第十五节:PHP静态属性和方法

php静态:声明类属性或方法为静态可以不实例化类而直接访问,静态属性不能通过一个类已实例化的对象来访问(但静态方法可以).

...