什么时候你会使用到PHP接口?

Posted by 撒得一地 on 2015年12月4日 in PHP笔记

作为一个PHP开发人员,可能你尚未发现或使用过接口。在PHP的世界里,它是一种常常被忽视的技术,尽管它是越来越常见。考虑到这一点,我相信你会同意,这是值得花几分钟学习一下接口的基本原理和操作方法。

什么是接口?

通常接口被描述为一个协议,一个接口确保为所有继承类提供特定的实现方法。换句话说,如果一个类继承了一个接口,那么它要承若提供一些特定的功能。这种契约是十分有用的,因为当其它类要使用这个类时,可以确保这个类的某些特性是可以被正常使用的。

当使用一个接口时,实现类可以互相替换。比如,让我们想象一下,类A和类B都继承了接口Z的执行方法helloworld()。类C接受接口Z作为参数并且调用hellworld()方法。两个实现类(A和B)对helloworld()可以有不同的实现,不过类C并不关心这个,只要类A和类B的对象实现了接口Z, 类A和类B的生成对象都可以作为参数传递给类C,类C可以利用它(在这个例子中通过调用helloworld()方法)。

上面说的废话有点多,下面将列举一个代码实例,来使它更容易理解。

接口如何区别于抽象类?

如果你熟悉抽象类,会发现接口工作在一个类似的方式,为使用接口的其它类提供了一个蓝图。这可能听起来令人困惑,因为你可能想知道为什么一个接口是必要的,如果抽象类已经可以提供类似用途。

通常,当你需要提供一些基本的或普通的功能时,通常会使用抽象类来扩展或修改派生类。我喜欢认为一个抽象类定义了一个类的核心标识。任何派生类都是同一类型,例如,你可能有一个抽象的"animal"类和派生的"dog"类。

另一方面接口定义了类如何与外部世界进行交互,并且可以被广泛的对象类型使用。举一个例子,你可以有一个"Moveable"接口,那么"Animal"和"Vehicle"等类型都可以实现它。

总结:

一个接口可以用来执行一个方法,或多个方法。还有,再次重申,类中必须实现接口中定义的所有方法,而且它可以添加额外的方法。

此外,一个类是不可能继承多个抽象类的,但它可以实现多个接口。

在PHP接口只包含方法声明,方法本身将是空的。与此形成对比的是抽象类,它可以添加一些逻辑方法并且可以在子类中重写或重载它。一个接口表达一个"有"(HAS A)的关系,而抽象类表示一个"是"(IS A)的关系。

底下将用实例来进一步加深理解:
下面是一个简单的接口,当其它类实现这个接口时必须实现接口中所有定义的方法。

interface RendererInterface {
    public function render();
}

下面是一些类实现相应的接口,而且必须实现接口中定义的所有方法:

class JsonRenderer implements RendererInterface {
    public function render() {

    }
}

class XMLRenderer implements RendererInterface {
    public function render() {

    }
}

注意,两个类继承了接口后都实现了接口的方法,如果没实现接口方法,将会抛出一个异常。而且,这些类都可以在你的应用程序中出现,并且可以相互替换,比如下面这个例子:

class blogPost {
    function __construct(RendererInterface $renderer) {

        $this->renderer = $renderer;

    }

    function render() {

        return $this->renderer->render();

    }
}

上面的类现在有能力使它包含许多不同格式的内容。这是通过传入一个render类来实现(render类实现“RendererInterface”)。
如果你不熟悉它,你可能也不熟悉php下的类型提示。如果是这种情况,那么参数传递到构造函数可能看起来有点特别,因为它的参数使用到了类型提示。

在内核中,类型提示允许你限制参数指定的类型。当在函数或类中使用的代码依赖于传递的对象类型时,这就有意义了。因为我们将对象赋值给一个类属性,然后调用一个特定的方法(render),我们的类是依赖于该特定方法实现的。通过键入提示参数对象类型'rendererinterface',并且调用相应的Render方法('return $this->renderer->render()')将是有效的。这意味着它可以传入任何类型的对象,只要它实现了接口。使用类型提示会使开发者更容易操作和维护代码。

接口真的需要在PHP等动态类型中存在吗?

基本上答案是否定的——接口并不是强制性的。在上面的示例中,代码可以被修改成这样:

class blogPost {

    function __construct($renderer) {

        $this->renderer = $renderer;

    }
 
    function render() {

        return $this->renderer->render();

    }
}

假设通过构造函数传入的对象有一个"render"方法,那么这段代码仍然会很好的运行。这是因为PHP是一种动态类型语言,而不是一个严格的类型的语言,如Java。

尽管这不是必需的,但在特定时候使用接口仍然是一个明智之举。举个个例子,你可能会发现要花很多时间在手动验证,如使用"is_object()",或"method_exists()"等函数在整个类中来验证类型/对象的传入是否正确。不过用一个接口类型提示就可以减去这部分手工验证,也使得代码更容易维护。

英文地址:http://www.tutorialized.com/tutorial/How-and-When-to-Use-an-Interface-in-PHP/82453

转载请注明本文地址:http://coderschool.cn/1202.html

标签:

上一篇:

下一篇:

相关推荐

网站地图|XML地图

Copyright © 2015-2024 技术拉近你我! All rights reserved.
闽ICP备15015576号-1 版权所有©psz.