php面向物件(OOP)—介面(interface)
PHP與大多數面向物件程式語言一樣,不支援多重繼承。也就是說每個類只能繼承一個父類。為了解決這個問題,PHP引入了介面,介面的思想是指定了一個實現了該介面的類必須實現的一系列方法。介面是一種特殊的抽象類,抽象類又是一種特殊的類,所以介面也是一種特殊的類,為 什麼說介面是一種特殊的抽象類呢?如果一個抽象類裡面的所有的方法都是抽象方法,那麼我們就換一種宣告方法使用“介面”;也就是說接口裡面所有的方法必須 都是宣告為抽象方法,另外接口裡面不能宣告變數(但可宣告常量constant),而且接口裡面所有的成員都是public許可權的。所以子類在實現的時候 也一定要使用public許可權實限。
宣告一個類的時候我們使用的關鍵字是“class”,而介面一種特殊的類,使用的關鍵字是“interface
類的定義: class 類名{ … } ,
介面的宣告:interface 介面名{ …}
<?php
//定義一個介面使用interface關鍵字,“One”為介面名稱
interface One
{
//定義一個常量
const constant = 'constant value';
//定義了一個抽象方法”fun1”
public function fun1();
//定義了抽象方法”fun2”
public function fun2();
}
?>
上例中定義了一個介面“one”,裡面聲明瞭兩個抽象方法“fun1”和”fun2”,因為接口裡面所有的方法都是抽象方法,所以在宣告抽象方法的時候就不用像抽象類那樣使用“abstract”這個關鍵字了,預設的已經加上這個關鍵字,另外在接口裡邊的”public”這個訪問許可權也可以去掉,因 為預設就是public的,因為接口裡所有成員都要是公有的,所在對於接口裡面的成員我們就不能使用“private”的和“protected”的許可權 了,都要用public或是預設的。另外在接口裡面我們也聲明瞭一個常量“constant“, 因為在接口裡面不能用變數成員,所以我們要使用 const這個關鍵字宣告。
因為介面是一種特殊的抽象類,裡面所有的方法都是抽象方法,所以介面也不能產生例項物件; 它也做為一種規範,所有抽象方法需要子類去實現。
我們可以使用”extends”關鍵字讓一個介面去繼承另一個介面:
<?php
//使用”extends”繼承另外一個介面
interface Two extends One
{
function fun3();
function fun4();
}
?>
而我們定義一介面的子類去實現介面中全部抽象方法使用的關鍵字是“implements”,而不是我們前面所說的“extends”;
<?php
//使用“implements”這個關鍵字去實現介面中的抽象方法 介面和類之間
class Three implements One
{
function fun1() {
...
}
function fun2() {
...
}
}
//實現了全部方法,我們去可以使用子類去例項化物件了
$three=new Three();
?>
我們也可以使用抽象類,去實現介面中的部分抽象方法,但要想例項化物件,這個抽象類還要有子類把它所有的抽象方法都實現才行;
在前面我們說過,PHP是單繼承的,一個類只能有一父類,但是一個類可以實現多個介面,就相當於一個類要遵守多個規範,就像我們不僅要遵守國家的法律,如果是在學校的話,還要遵守學校的校規一樣;
<?php//使用implements實現多個介面
class Four implemtns 介面一, 介面二, ...
{
//必須把所有介面中的方法都要實現才可以例項化物件。
}
?>
PHP中不僅一個類可以實現多個介面,也可以在繼承一個類的同時實現多個介面, 一定要先繼承類再去實現介面;
<?php
//使用extends繼承一個類,使用implements實現多個介面
class Four extends 類名一 implemtns 介面一, 介面二, ...
{
//所有介面中的方法都要實現才可以例項化物件
...
}
?>
上面的內容引自"小炒花生米"大哥,謝謝大哥的分享。