激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - PHP教程 - PHP 面向?qū)ο蟪绦蛟O(shè)計(jì)(oop)學(xué)習(xí)筆記(一) - 抽象類(lèi)、對(duì)象接口、instanceof 和契約式編程

PHP 面向?qū)ο蟪绦蛟O(shè)計(jì)(oop)學(xué)習(xí)筆記(一) - 抽象類(lèi)、對(duì)象接口、instanceof 和契約式編程

2020-07-04 14:10PHP編程入門(mén) PHP教程

面向?qū)ο蟪绦蛟O(shè)計(jì)(OOP)是一種計(jì)算機(jī)編程架構(gòu)。OOP的一條基本原則是計(jì)算機(jī)程序是由單個(gè)能夠起到子程序作用的單元或?qū)ο蠼M合而成。OOP達(dá)到了軟件工程的三個(gè)主要目標(biāo):重用性、靈活性和擴(kuò)展性。為了實(shí)現(xiàn)整體運(yùn)算,每個(gè)對(duì)象

1、PHP中的抽象類(lèi)

PHP 5 支持抽象類(lèi)和抽象方法。定義為抽象的類(lèi)不能被實(shí)例化。任何一個(gè)類(lèi),如果它里面至少有一個(gè)方法是被聲明為抽象的,那么這個(gè)類(lèi)就必須被聲明為抽象的。被定義為抽象的方法只是聲明了其調(diào)用方式(參數(shù)),不能定義其具體的功能實(shí)現(xiàn)。在類(lèi)的聲明中使用 abstract 修飾符可以將某個(gè)類(lèi)聲明為抽象的。

可以這樣理解,抽象類(lèi)作為一個(gè)基類(lèi),它把特定的細(xì)節(jié)留給繼承者來(lái)實(shí)現(xiàn)。通過(guò)抽象概念,可以在開(kāi)發(fā)項(xiàng)目中創(chuàng)建擴(kuò)展性很好的架構(gòu)。

 

復(fù)制代碼 代碼如下:

abstract class AbstractClass
{
    code...
}

 

1.1、抽象方法

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

 

復(fù)制代碼 代碼如下:

abstract public function prototypeName($protoParam);

 

繼承一個(gè)抽象類(lèi)的時(shí)候,子類(lèi)必須定義父類(lèi)中的所有抽象方法;另外,這些方法的訪問(wèn)控制必須和父類(lèi)中一樣(或者更為寬松)。此外方法的調(diào)用方式必須匹配,即類(lèi)型和所需參數(shù)數(shù)量必須一致。

1.2、關(guān)于抽象類(lèi)

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

 

復(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è)類(lèi)必須實(shí)現(xiàn)哪些方法,但不需要定義這些方法的具體內(nèi)容。

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

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

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

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

2.1接口實(shí)現(xiàn)(implements)

要實(shí)現(xiàn)一個(gè)接口,使用 implements 操作符(繼承抽象類(lèi)需要使用 extends 關(guān)鍵字不同),類(lèi)中必須實(shí)現(xiàn)接口中定義的所有方法,否則會(huì)報(bào)一個(gè)致命錯(cuò)誤。類(lèi)可以實(shí)現(xiàn)多個(gè)接口,用逗號(hào)來(lái)分隔多個(gè)接口的名稱(chēng)。

實(shí)現(xiàn)多個(gè)接口時(shí),接口中的方法不能有重名。
接口也可以繼承,通過(guò)使用 extends 操作符。
類(lèi)要實(shí)現(xiàn)接口,必須使用和接口中所定義的方法完全一致的方式。否則會(huì)導(dǎo)致致命錯(cuò)誤。
接口中也可以定義常量。接口常量和類(lèi)常量的使用完全相同,但是不能被子類(lèi)或子接口所覆蓋。
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、類(lèi)型運(yùn)算符 instanceof

instanceof 運(yùn)算符是 PHP5 中的一個(gè)比較操作符。他接受左右兩邊的參數(shù),并返回一個(gè)boolean值。

確定一個(gè) PHP 變量是否屬于某個(gè)一類(lèi) CLASS 的實(shí)例
檢查對(duì)象是不是從某個(gè)類(lèi)型繼承
檢查對(duì)象是否屬于某個(gè)類(lèi)的實(shí)例
確定一個(gè)變量是不是實(shí)現(xiàn)了某個(gè)接口的對(duì)象的實(shí)例

 

復(fù)制代碼 代碼如下:


echo $Porsche911 instanceof Car;
//result:1

 

echo $Porsche911 instanceof ISpeendInfo;
//result:1

 

4.契約式編程

契約式設(shè)計(jì)或者Design by Contract (DbC)是一種設(shè)計(jì)計(jì)算機(jī)軟件的方法。這種方法要求軟件設(shè)計(jì)者為軟件組件定義正式的,精確的并且可驗(yàn)證的接口,這樣,為傳統(tǒng)的抽象數(shù)據(jù)類(lèi)型又增加了先驗(yàn)條件、后驗(yàn)條件和不變式。這種方法的名字里用到的“契約”或者說(shuō)“契約”是一種比喻,因?yàn)樗蜕虡I(yè)契約的情況有點(diǎn)類(lèi)似。

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

5.總結(jié)

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

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

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

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

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

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

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

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 日韩视频一区二区三区在线观看 | 日本道中文字幕 | 久久99精品久久久久久秒播放器 | av日韩在线免费观看 | 久久草草亚洲蜜桃臀 | 一级黄色毛片a | 性少妇videosexfreexx | 91精品国啪老师啪 | 久章草影院 | 99久久九九爱看免费直播 | 国产中文99视频在线观看 | 鲁久久 | 一区二区三区在线播放视频 | 91色综合综合热五月激情 | chengrenzaixian| 日日噜噜夜夜爽 | 国产一级淫片在线观看 | 色网站综合 | 嫩草影院在线观看网站成人 | 欧美18一19sex性护士农村 | 精品一区二区三区免费视频 | 思思久而久而蕉人 | 国产一级午夜 | 国产精品一区二区三区在线看 | 懂色粉嫩av久婷啪 | 成人免费午夜视频 | 精品一区二区三区毛片 | 校花被肉干高h潮不断 | 毛片在线看免费 | 国产一区精品视频 | av成人免费看 | 亚洲一级簧片 | 国产亚洲精品久久久久久久久 | 一级毛片电影网 | 2019亚洲日韩新视频 | 国产九九热视频 | 欧美一级三级在线观看 | 欧美爱爱视频网站 | av免费在线播放 | 91情侣在线偷精品国产 | 免费观看三级毛片 |