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

PHP 面向對象程序設計(oop)學習筆記(一) - 抽象類、對象接口、instanceof 和契約式編程

1、php中的抽象類

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

可以這樣理解,抽象類作為一個基類,它把特定的細節留給繼承者來實現。通過抽象概念,可以在開發項目中創建擴展性很好的架構。

復制代碼 代碼如下:
abstract class AbstractClass
{
    code...
}

1.1、抽象方法

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

復制代碼 代碼如下:
abstract public function prototypeName($protoParam);

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

1.2、關于抽象類

某個類只要包含至少一個抽象方法就必須聲明為抽象類
聲明為抽象的方法,在實現的時候必須包含相同的或者更低的訪問級別。
不能使用 new 關鍵字創建抽象類的實例。
被聲明為抽象的方法不能包含函數體。
如果將擴展的類也聲明為抽象類,在擴展抽象類時,可以不用實現所有的抽象方法。(如果某個類從抽象類繼承,當它沒有實現基類中所聲明的所有抽象方法時,它就必須也被聲明為抽象的。)
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),可以指定某個類必須實現哪些方法,但不需要定義這些方法的具體內容。

接口是通過 interface 關鍵字來定義的,就像定義一個標準的類一樣,但其中定義所有的方法都是空的。

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

接口是一種類似于類的結構,可用于聲明實現類所必須聲明的方法。例如,接口通常用來聲明API,而不用定義如何實現這個API。

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

2.1接口實現(implements)

要實現一個接口,使用 implements 操作符(繼承抽象類需要使用 extends 關鍵字不同),類中必須實現接口中定義的所有方法,否則會報一個致命錯誤。類可以實現多個接口,用逗號來分隔多個接口的名稱。

實現多個接口時,接口中的方法不能有重名。
接口也可以繼承,通過使用 extends 操作符。
類要實現接口,必須使用和接口中所定義的方法完全一致的方式。否則會導致致命錯誤。
接口中也可以定義常量。接口常量和類常量的使用完全相同,但是不能被子類或子接口所覆蓋。
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 中的一個比較操作符。他接受左右兩邊的參數,并返回一個boolean值。

確定一個 php 變量是否屬于某個一類 CLASS 的實例
檢查對象是不是從某個類型繼承
檢查對象是否屬于某個類的實例
確定一個變量是不是實現了某個接口的對象的實例

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

echo $Porsche911 instanceof ISpeendInfo;
//result:1

4.契約式編程

契約式設計或者Design by Contract (DbC)是一種設計計算機軟件的方法。這種方法要求軟件設計者為軟件組件定義正式的,精確的并且可驗證的接口,這樣,為傳統的抽象數據類型又增加了先驗條件、后驗條件和不變式。這種方法的名字里用到的“契約”或者說“契約”是一種比喻,因為它和商業契約的情況有點類似。

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

5.總結

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

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

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

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

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

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

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

php技術PHP 面向對象程序設計(oop)學習筆記(一) - 抽象類、對象接口、instanceof 和契約式編程,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 日本六九视频 | 忘忧草在线影院www日本 | 国产欧美无码亚洲 | 99热国产这里只有精品9九 | 快播在线电影网站 | 亚洲AV无码一区二区色情蜜芽 | 寂寞骚妇女被后入式抽插 | 午夜福利不卡片在线播放免费 | 饥渴的新婚女教师 | 新香蕉少妇视频网站 | 蜜臀AV人妻久久无码精品麻豆 | 国产精品亚洲高清一区二区 | 国产三级精品三级在线观看 | 毛片大片免费看 | 妈妈的朋友6未删减版完整在线 | www.三级| 3d在线看小舞被躁视频 | 日韩毛片在线视频 | 青青久久网 | 亚洲免费综合色视频 | 日本无码毛片一区二区手机看 | 20岁中国男同志china1069 20岁αsrian男同志免费 | 一二三四在线播放免费观看中文版视频 | 亚洲中文热码在线视频 | 久久亚洲精品AV无码四区 | YELLOW视频直播在线观看 | 国产亚洲精品在浅麻豆 | 暖暖视频 免费 高清 日本8 | 蜜臀AV浪潮99国产麻豆 | 美女张开腿露尿口给男人亲 | 渔夫床满艳史bd高清在线直播 | 欧美最新色p图 | 亚洲黄色片免费看 | 亚洲精品无码葡京AV天堂 | 日本免费一区二区三区最新vr | 无码任你躁久久久久久老妇双奶 | 冰山高冷受被c到哭np双性 | 国产人妻久久久精品麻豆 | 高中生被C到爽哭视频免费 高挑人妻无奈张开腿 | 55夜色66夜亚洲精品播放 | 性做久久久久久久久浪潮 |