第十一章:對象接口

使用接口(interface),可以指定某個類必須實現(xiàn)哪些方法,但不需要定義這些方法的具體內容。

接口是通過 interface 關鍵字來定義的,就像定義一個標準的類一樣,但其中定義所有的方法都是空的。

接口中定義的所有方法都必須是公有,這是接口的特性。

要實現(xiàn)一個接口,使用 implements 操作符。類中必須實現(xiàn)接口中定義的所有方法,否則會報一個致命錯誤。類可以實現(xiàn)多個接口,用逗號來分隔多個接口的名稱。

注意:
1、實現(xiàn)多個接口時,接口中的方法不能有重名。
2、接口也可以繼承,通過使用 [extends]操作符。
3、類要實現(xiàn)接口,必須使用和接口中所定義的方法完全一致的方式。否則會導致致命錯誤。
4、接口中也可以定義常量。接口常量和[類常量]的使用完全相同,但是不能被子類或子接口所覆蓋。

接口示例:

<?php

// 聲明一個'iTemplate'接口
interface iTemplate
{
    public function setVariable($name, $var);
    public function getHtml($template);
}


// 實現(xiàn)接口
// 下面的寫法是正確的
class Template implements iTemplate
{
    private $vars = array();
  
    public function setVariable($name, $var)
    {
        $this->vars[$name] = $var;
    }
  
    public function getHtml($template)
    {
        foreach($this->vars as $name => $value) {
            $template = str_replace('{' . $name . '}', $value, $template);
        }
 
        return $template;
    }
}

// 下面的寫法是錯誤的,會報錯,因為沒有實現(xiàn) getHtml():
// Fatal error: Class BadTemplate contains 1 abstract methods
// and must therefore be declared abstract (iTemplate::getHtml)
class BadTemplate implements iTemplate
{
    private $vars = array();
  
    public function setVariable($name, $var)
    {
        $this->vars[$name] = $var;
    }
}
?>

可擴充接口:

<?php
interface a
{
    public function foo();
}

interface b extends a
{
    public function baz(Baz $baz);
}

// 正確寫法
class c implements b
{
    public function foo()
    {
    }

    public function baz(Baz $baz)
    {
    }
}

// 錯誤寫法會導致一個致命錯誤
class d implements b
{
    public function foo()
    {
    }

    public function baz(Foo $foo)
    {
    }
}
?>

繼承多個接口:

<?php
interface a
{
    public function foo();
}

interface b
{
    public function bar();
}

interface c extends a, b
{
    public function baz();
}

class d implements c
{
    public function foo()
    {
    }

    public function bar()
    {
    }

    public function baz()
    {
    }
}
?>

使用接口常量:

<?php
interface a
{
    const b = 'Interface constant';
}

// 輸出接口常量
echo a::b;

// 錯誤寫法,因為常量不能被覆蓋。接口常量的概念和類常量是一樣的。
class b implements a
{
    const b = 'Class constant';
}
?>
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,544評論 19 139
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,644評論 18 399
  • 兩個人一起的愛情 分手從來不是一蹴而就的 而是在漫長的時間里 慢慢的滋生出了 失望的情緒 然后一點一點累積 最后匯...
    幻夢邪魂閱讀 320評論 0 3
  • 品牌價值和商業(yè)模式 你會發(fā)現(xiàn)很多人對各種商業(yè)模式好象很熟,還有人上來就問能賺多少錢,用下面一個故事來更清晰的分析什...
    69ac1a39c134閱讀 635評論 0 0
  • 2015.10.29 我從不是,會寫故事的人。 只因腹中詩書不多,也無論氣之華。 經歷了,算不上刻骨銘心的愛戀,也...
    抽屜DRAWER閱讀 115評論 0 0

友情鏈接更多精彩內容