天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

PHP OPP機(jī)制和模式簡介(抽象類、接口和契約式編程)

1.抽象類

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

1.1方法原型(prototype)

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

復(fù)制代碼 代碼如下:
public function prototypeName($protoParam)

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

1.2關(guān)于抽象類

    某個(gè)類只要包含至少一個(gè)抽象方法就必須聲明為抽象類
    聲明為抽象的方法,在實(shí)現(xiàn)的時(shí)候必須包含相同的或者更低的訪問級(jí)別。
    不能使用 new 關(guān)鍵字創(chuàng)建抽象類的實(shí)例。
    被生命為抽象的方法不能包含函數(shù)體。
    如果將擴(kuò)展的類也聲明為抽象類,在擴(kuò)展抽象類時(shí),可以不用實(shí)現(xiàn)所有的抽象方法。(如果某個(gè)類從抽象類繼承,當(dāng)它沒有實(shí)現(xiàn)基類中所聲明的所有抽象方法時(shí),它就必須也被聲明為抽象的。)

1.3使用抽象類

復(fù)制代碼 代碼如下:
<?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.對(duì)象接口

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

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

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

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

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

2.1使用接口

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

2.2使用接口的案例

復(fù)制代碼 代碼如下:
<?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中的一個(gè)比較操作符。他接受左右兩邊的參數(shù),并返回一個(gè)boolean值。這個(gè)操作符是用來確定對(duì)象的某個(gè)實(shí)例是否為特定的類型,或者是否從某個(gè)類型繼承,又或者實(shí)現(xiàn)類某個(gè)特定的接口。

復(fù)制代碼 代碼如下:
echo $Porsche911 instanceof Car;
//result:1

echo $Porsche911 instanceof ISpeendInfo;
//result:1

4.契約式編程

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

5.總結(jié)

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

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

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

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

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

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

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

php技術(shù)PHP OPP機(jī)制和模式簡介(抽象類、接口和契約式編程),轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 亚洲精品乱码久久久久久直播 | 日本高清无卡码一区二区久久 | 三级黄色a| 亚洲欧美自拍清纯中文字幕 | 国产高潮国产高潮久久久久久 | 免费国产综合视频在线看 | 亚洲色图在线视频 | WWW久久只有这里有精品 | 欧美16一17sex性hd | 色橹橹欧美在线观看视频高清 | 精品久久久亚洲精品中文字幕 | 乱奷XXXXXHD | 免费看欧美一级特黄a大片 免费看欧美xxx片 | 国产成人精品男人的天堂网站 | 鬼灭之刃花街篇免费樱花动漫 | 一线高清视频在线播放 | 6080yy亚洲久久无码 | 日韩AV片无码一区二区三区不卡 | 高清日本片免费观看 | 午夜一个人在线观看完整版 | 久久永久视频 | 窝窝影院午夜看片毛片 | 在线视频 中文字幕 | 亚洲精品喷白浆在线观看 | 国产成人无码精品久久久免费69 | gay台湾无套男同志xnxⅹ | 一区二区三区无码被窝影院 | 近亲乱中文字幕 | 丝瓜视频樱桃视频在线观看免费 | 欧美一区二区激情视频 | 朝鲜美女bbwbbw撒尿 | 99久久亚洲精品影院 | 体内精69xxxxxx喷潮 | 蜜桃传媒一区二区亚洲AV | 国产精品v片在线观看不卡 国产精品v欧美精品v日韩 | 色戒未删减版在线观看完整 | 秋霞电影在线观看午夜伦 | 亚洲精品一区二区在线看片 | 日本夜夜夜 | 美女快播第一网 | 曰本老头同性xxxxx |