午夜国产狂喷潮在线观看|国产AⅤ精品一区二区久久|中文字幕AV中文字幕|国产看片高清在线

    php opp機制和模式簡介(抽象類、接口和契約式編程)
    來源:易賢網(wǎng) 閱讀:971 次 日期:2014-10-08 14:20:42
    溫馨提示:易賢網(wǎng)小編為您整理了“php opp機制和模式簡介(抽象類、接口和契約式編程)”,方便廣大網(wǎng)友查閱!

    1.抽象類

    抽象類機制中總是要定義一個公共的基類,而將特定的細節(jié)留給繼承者來實現(xiàn)。通過抽象概念,可以在開發(fā)項目中創(chuàng)建擴展性很好的架構(gòu)。任何一個類,如果它里面至少有一個方法是被聲明為抽象的,那么這個類就必須被聲明為抽象的。被定義為抽象的方法只是聲明了其調(diào)用方式(參數(shù)),不能定義其具體的功能實現(xiàn)。在類的聲明中使用 abstract 修飾符就可以將某個類聲明為抽象的。

    1.1方法原型(prototype)

    是指方法的定義中剔除了方法體之后的簽名。它包括存取級別、函數(shù)關(guān)鍵字、函數(shù)名稱和參數(shù)。他不包含({})或者括號內(nèi)部的任何代碼。例如下面的代碼就是一個方法原型:

    代碼如下:

    public function prototypename($protoparam)

    繼承一個抽象類的時候,子類必須定義父類中的所有抽象方法;另外,這些方法的訪問控制必須和父類中一樣(或者更為寬松)。

    1.2關(guān)于抽象類

    某個類只要包含至少一個抽象方法就必須聲明為抽象類

    聲明為抽象的方法,在實現(xiàn)的時候必須包含相同的或者更低的訪問級別。

    不能使用 new 關(guān)鍵字創(chuàng)建抽象類的實例。

    被生命為抽象的方法不能包含函數(shù)體。

    如果將擴展的類也聲明為抽象類,在擴展抽象類時,可以不用實現(xiàn)所有的抽象方法。(如果某個類從抽象類繼承,當(dāng)它沒有實現(xiàn)基類中所聲明的所有抽象方法時,它就必須也被聲明為抽象的。)

    1.3使用抽象類

    代碼如下:

    <?php

    abstract class car

    {

    abstract function getmaxspeend();

    }

    class roadster extends car

    {

    public $speend;

    public function setspeend($speend = 0)

    {

    $this->speend = $speend;

    }

    public function getmaxspeend()

    {

    return $this->speend;

    }

    }

    class street

    {

    public $cars ;

    public $speendlimit ;

    function __construct( $speendlimit = 200)

    {

    $this -> speendlimit = $speendlimit;

    $this -> cars = array();

    }

    protected function isstreetlegal($car)

    {

    if ($car->getmaxspeend() < $this -> speendlimit)

    {

    return true;

    }

    else

    {

    return false;

    }

    }

    public function addcar($car)

    {

    if($this->isstreetlegal($car))

    {

    echo 'the car was allowed on the road.';

    $this->cars[] = $car;

    }

    else

    {

    echo 'the car is too fast and was not allowed on the road.';

    }

    }

    }

    $porsche911 = new roadster();

    $porsche911->setspeend(340);

    $fuwaistreet = new street(80);

    $fuwaistreet->addcar($porsche911);

    /**

    *

    * @result

    *

    * the car is too fast and was not allowed on the road.[finished in 0.1s]

    *

    */

    ?>

    2.對象接口

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

    接口是通過 interface 關(guān)鍵字來定義的,就像定義一個標(biāo)準(zhǔn)的類一樣,但其中定義所有的方法都是空的。

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

    接口是一種類似于類的結(jié)構(gòu),可用于聲明實現(xiàn)類所必須聲明的方法。例如,接口通常用來聲明api,而不用定義如何實現(xiàn)這個api。

    大多數(shù)開發(fā)人員選擇在接口名稱前加上大寫字母i作為前綴,以便在代碼和生成的文檔中將其與類區(qū)別開來。

    2.1使用接口

    和集成抽象類需要使用 extends 關(guān)鍵字不同的是,實現(xiàn)接口使用的是 implements 關(guān)鍵字。一個類可以實現(xiàn)多個接口,這時,我們需要用逗號將他們隔開。如果將某個類標(biāo)記為實現(xiàn)了某個接口,但卻沒有實現(xiàn)這個借口的所有方法,將會拋出錯誤。

    2.2使用接口的案例

    代碼如下:

    <?php

    abstract class car

    {

    abstract function setspeend($speend = 0);

    }

    interface ispeendinfo

    {

    function getmaxspeend();

    }

    class roadster extends car implements ispeendinfo

    {

    public $speend;

    public function setspeend($speend = 0)

    {

    $this->speend = $speend;

    }

    public function getmaxspeend()

    {

    return $this->speend;

    }

    }

    class street

    {

    public $cars ;

    public $speendlimit ;

    function __construct( $speendlimit = 200)

    {

    $this -> speendlimit = $speendlimit;

    $this -> cars = array();

    }

    protected function isstreetlegal($car)

    {

    if ($car->getmaxspeend() < $this -> speendlimit)

    {

    return true;

    }

    else

    {

    return false;

    }

    }

    public function addcar($car)

    {

    if($this->isstreetlegal($car))

    {

    echo 'the car was allowed on the road.';

    $this->cars[] = $car;

    }

    else

    {

    echo 'the car is too fast and was not allowed on the road.';

    }

    }

    }

    $porsche911 = new roadster();

    $porsche911->setspeend(340);

    $fuwaistreet = new street(80);

    $fuwaistreet->addcar($porsche911);

    /**

    *

    * @result

    *

    * the car is too fast and was not allowed on the road.[finished in 0.1s]

    *

    */

    ?>

    3.instanceof 操作符

    instanceof 操作符是php5中的一個比較操作符。他接受左右兩邊的參數(shù),并返回一個boolean值。這個操作符是用來確定對象的某個實例是否為特定的類型,或者是否從某個類型繼承,又或者實現(xiàn)類某個特定的接口。

    代碼如下:

    echo $porsche911 instanceof car;

    //result:1

    echo $porsche911 instanceof ispeendinfo;

    //result:1

    4.契約式編程

    契約式編程是指在編寫類之前實現(xiàn)聲明接口的一種編程實踐。這種方法在保證類的封裝性方面非常有用。使用契約式編程技術(shù),我們可以在創(chuàng)建應(yīng)用程序之前定義出視圖實現(xiàn)的功能,這和建筑師在修建大樓之前先畫好藍圖的做法非常相似。

    5.總結(jié)

    抽象類是使用 abstract 關(guān)鍵字聲明的類。通過將某個類標(biāo)記為抽象類,我們可以推遲實現(xiàn)所聲明的方法。要將某個方法聲明為抽象方法,只要去掉包含所有大括號的方法實體,將方法聲明的代碼行用分號結(jié)束即可。

    抽象類不能直接實例化,他們必須被繼承。

    如果某個類從抽象類繼承,當(dāng)它沒有實現(xiàn)基類中所聲明的所有抽象方法時,它就必須也被聲明為抽象的。

    在接口中,我們可以聲明沒有方法體的方法原型,這點與抽象類很相似。他們之間的區(qū)別在于,接口不能聲明任何具有方法體的方法;并且他們使用的語法也不一樣。為了將揭開規(guī)則強制加到某個類上,我們需要使用implements關(guān)鍵字,而不是extends關(guān)鍵字。

    有些情況下我們需要確定某個類是否是特定類的類型,或者是否實現(xiàn)了特定的接口。 instanceof 分成適合完成這個任務(wù)。instanceof 檢查三件事情:實例是否是某個特定的類型,實例是否從某個特定的類型繼承,實例或者他的任何祖先類是否實現(xiàn)類特定的接口。

    某些語言具有從多個類繼承的能力,這稱為多重繼承。php不支持多重繼承。想法,他提供了為一個類聲明多個接口的功能。

    接口在聲明類必須遵循的規(guī)則時非常有用。契約式編程技術(shù)使用這一功能來增強封裝性,優(yōu)化工作流。

    更多信息請查看IT技術(shù)專欄

    更多信息請查看網(wǎng)絡(luò)編程
    由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

    2025國考·省考課程試聽報名

    • 報班類型
    • 姓名
    • 手機號
    • 驗證碼
    關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
    工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
    云南網(wǎng)警備案專用圖標(biāo)
    聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
    咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
    云南網(wǎng)警報警專用圖標(biāo)