1. 程式人生 > >PHP面向介面程式設計瞭解下(一)

PHP面向介面程式設計瞭解下(一)

咱這裡先宣告下,面向介面程式設計並不是一種新的程式設計正規化,咱這裡說的是狹義的介面,也就是interface關鍵字。之後,咱們就先來看下介面的作用。

介面,主要是定義一套規範,來描述一個“物”的功能,要求如果現實中的“物”想成為可用的,就必須實現某些基本功能。可以這麼理解:對於實現介面的所有類,看起來都應該與介面類似。

介面常用來作為類與類之間的一個協議,可以說介面是抽象類的變體,其中所有的方法都是抽象的,沒有一個程式體。

介面除了可以包含方法外,還可以包含常量。

我們來舉個栗子描述下介面,使用介面描述機動車。

我們想要判斷機動車是否合格,至於什麼車(怎麼實現),前輪還是後輪(程式是什麼樣子),這些都不是介面需要關心的,因為介面為抽象而生,我們要判斷這輛車是否合格,只需要按著介面的定義,一條條的驗證,有不符合定義的,那麼這輛車,就是廢品,如果沒有,那就合格,至於這輛車裝修是否豪華,跟我們沒有關係的。

說白了,介面就是一種契約,在程式裡,介面的方法必須被全部實現,否則,將會報一個致命錯誤。來看一段程式碼感受下效果:

interface car{
    public function body();
}

class baoma implements car{
    public function body()
    {
        // TODO: Implement body() method.
        echo "i am baoma";
    }
}

class aodi implements car{
    public function body()
    {
        // TODO: Implement body() method.
        echo "i am aodi";
    }

    public function title()
    {
        echo "i am aodi title";
    }
}

class benchi{
    public function title(car $a)
    {
        $a->title();
    }
}

$obj = new benchi();
$obj->title(new baoma());
$obj->title(new aodi());

上述程式碼中,我們定義了一個car介面,內含一個body功能,之後用baoma和aodi類來實現這個介面,並且在aodi中新增一個title功能,之後我們在benchi類中使用型別約束指定要檢測的是car這個介面,但是car裡面並沒有title這個功能,所以,就會報錯。

很明顯我們可以看出來,這段程式碼是錯誤的,因為它不符合介面的語義。

但是嘞,在PHP裡,我們來對aodi這個類來檢測的時候,卻是可以正常執行的。

我們可以看出來,PHP它本身只關心這個繼承介面的類是否實現了介面中的所有方法,而不關心這個程式碼的介面語義是否正確。

按著道理來講,介面應該起一個強制規範和契約的作用,但是上述程式碼對介面的約束並沒有起作用,也打破了契約。廢話不多說,咱們來看下在Java中是如何來處理上述情況的。

Java認為呢,介面就是一種type,也就是說型別,如果你繼承了我的介面,完事又打破了你我之間的契約,那麼你的行為我就無法控制了,所以你就是非法的。符合邏輯吧。。。

介面呢,不僅規範介面的實現者,還會規範介面的執行者,它不允許呼叫介面中不存在的方法。

當然啦,這不是說一個類,如果實現了介面,就只能實現介面中含有的方法,它的意思是,如果針對介面,而不是具體的類,就只能按著介面的契約辦事。

這種規範呢,對於我們使用介面是非常有利的,它可以讓我們的程式更加健壯,從這個角度來看的話,為了保證介面的語義,通常一個介面的實現類只是實現該介面所具有的方法,做到專一,當然,這不是一成不變的。

通常在大的專案裡,我們會把程式碼進行分層和分工,例如,核心開發人員和技術經理編寫核心的流程和程式碼,往往是以介面的形式給出,之後就是基層開發人員針對這些介面來進行像資料庫操作之類的程式碼填充,這樣一來,核心技術人員就可以把更多的精力投入到技術攻關和業務邏輯中。

通常情況就是,前端針對介面程式設計的話,只管在actioncen層次呼叫server的服務,而不管具體的實現細節,對於後端的開發人員來說,就只需要負責實現server層次的業務就好,這樣,就實現了程式碼的分工與合作。

在這裡咱再提一嘴啊,介面本身並不提供實現,它只是提供一個規範,比如我們知道某個類實現了某個介面,我們就可以知道,在這個類中,我們可以呼叫哪些方法,但是,在PHP中,介面的語義是有限的,使用介面的地方並不多,我們可以將其淡化為設計文件,起到一個團隊基本契約的作用。

好啦,這篇文章咱就不廢話了啊,敬請期待後續文章。

如果感覺不錯的話,請多多點贊支援哦。。。