• 周蓬安.blog的博客—强国博客—人民网 2019-05-10
  • 紫光阁中共中央国家机关工作委员会 2019-05-10
  • 感触名家笔下的端午文化吃香粽原来可以这样文艺 2019-05-09
  • 追梦夺冠游行嘲讽詹皇 百万人面前穿订制T恤羞辱他 2019-04-27
  • 《瘟疫传说》:黑死病恐怖 姐弟在绝望中求生 2019-04-10
  • 陕西国防工业职业技术学院百名大学生志愿者敬老院慰问孤寡老人陕西国防工业职业技术学院百名大学生志愿者敬老院慰问-陕西教育新闻 2019-04-08
  • 西藏拉萨:新家园 新生活 2019-04-08
  • 尊重和保障宗教信仰自由的中国实践 2019-04-06
  • 一敬泯恩仇 俄罗斯队主帅这个动作太暖了 2019-03-20
  • 四大名著剧组首次同台忆往事 经典影视剧如何铸就? 2018-12-07
  • “天眼”凝望 探秘宇宙 2018-12-07
  • 0

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

    Posted by 撒得一地 on 2015年12月4日 in PHP笔记
    国外稳定加速器推荐    Express | Vypr

    作为一个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()"等函数在整个类中来验证类型/对象的传入是否正确。不过用一个接口类型提示就可以减去这部分手工验证,也使得代码更容易维护。

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

    转载请注明本文地址://www.cfage.com/1202.html

    标签:

    上一篇:

    下一篇:

    相关推荐

    发表评论

    电子邮件地址不会被公开。 必填项已用*标注

    0 + 0 = ?

    网站地图|广东快乐10分开奖直播

    Copyright © 2015-2019 广东快乐10分开奖直播 All rights reserved.
    闽ICP备15015576号-1,版权所有?psz.

  • 周蓬安.blog的博客—强国博客—人民网 2019-05-10
  • 紫光阁中共中央国家机关工作委员会 2019-05-10
  • 感触名家笔下的端午文化吃香粽原来可以这样文艺 2019-05-09
  • 追梦夺冠游行嘲讽詹皇 百万人面前穿订制T恤羞辱他 2019-04-27
  • 《瘟疫传说》:黑死病恐怖 姐弟在绝望中求生 2019-04-10
  • 陕西国防工业职业技术学院百名大学生志愿者敬老院慰问孤寡老人陕西国防工业职业技术学院百名大学生志愿者敬老院慰问-陕西教育新闻 2019-04-08
  • 西藏拉萨:新家园 新生活 2019-04-08
  • 尊重和保障宗教信仰自由的中国实践 2019-04-06
  • 一敬泯恩仇 俄罗斯队主帅这个动作太暖了 2019-03-20
  • 四大名著剧组首次同台忆往事 经典影视剧如何铸就? 2018-12-07
  • “天眼”凝望 探秘宇宙 2018-12-07
  • 体彩排列3试机号 中国福利彩票七乐彩 体彩幸运赛车走势图带线 中国足彩网足球比分直播 新时时彩走势图怎么不全 湖南彩票双色球开奖 福彩双色球基本走势图 北京赛车如何刷返水 河南泳坛夺金计算公式 重庆时时彩开奖网站 双色球基本走势图2014 3d057期试机号 足彩半全场胜负是什么意思 腾讯彩票免费领彩金 北京赛车pk10直播网 爱彩人湖南幸运赛车