首頁  >  文章  >  後端開發  >  php物件介面是什麼?各種類別介面程式碼詳解

php物件介面是什麼?各種類別介面程式碼詳解

伊谢尔伦
伊谢尔伦原創
2017-07-08 09:19:161844瀏覽

物件介面

使用介面(interface),可以指定某個類別必須實作哪些方法,但不需要定義這些方法的具體內容。介面是透過 interface 關鍵字來定義的,就像定義一個標準的類別一樣,但其中定義所有的方法都是空的。介面中定義的所有方法都必須是公有,這是介面的特性。

實作(implements)

要實作一個接口,使用 implements 運算子。類別中必須實作介面中定義的所有方法,否則會報一個致命錯誤。類別可以實作多個接口,用逗號來分隔多個接口的名稱。

note1:實作多個介面時,介面中的方法不能有重名。

note2:介面也可以繼承,透過使用 extends 運算子。

繼承已為大家所熟知的一個程式設計特性,PHP 的物件模型也使用了繼承。繼承將會影響到類別與類,物件與物件之間的關係。例如,當擴展一個類,子類別就會繼承父類所有公有的和受保護的方法。除非子類別覆寫了父類別的方法,被繼承的方法都會保留其原始功能。繼承對於功能的設計和抽像是非常有用的,而且對於類似的物件增加新功能就無須重新再寫這些公用的功能。

note3:除非使用了自動載入,否則一個類別必須在使用之前被定義。如果一個類別擴展了另一個,則父類別必須在子類別之前被聲明。此規則適用於類別繼承其它類別與介面。  

note:4:類別要實作接口,必須使用和介面中所定義的方法完全一致的方式。否則會導致致命錯誤。

常數

介面中也可以定義常數。介面常數和類別常數的使用完全相同,但是不能被子類別或子介面所覆蓋。

可以把在類別中始終保持不變的值定義為常數。在訂定和使用常數的時候不需要使用  符號。常量的值必須是定值,不能是變量,類別屬性,數學運算的結果或函數呼叫。介面(interface)中也可以定義常數。

interface範例:

Example #1 介面範例

<?php

// 声明一个&#39;iTemplate&#39;接口
interface iTemplate
{
    public function setVariable($name, $var);
    public function getHtml($template);
}


// 实现接口
// 下面的写法是正确的
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(&#39;{&#39; . $name . &#39;}&#39;, $value, $template);
        }
 
        return $template;
    }
}

// 下面的写法是错误的,会报错,因为没有实现 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;
    }
}
?>

Example #2 可擴充的介面

<?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)
    {
    }
}
?>

Example #3 繼承多個介面

<?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()
    {
    }
}
?>

Example #4使用介面常數

82c5cd273c0cea15ecd5ad37382a7460

 

#

以上是php物件介面是什麼?各種類別介面程式碼詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn