標籤:ini 一個 聲明 iss 首碼 不能 精確 max 案例
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 物件導向程式設計(oop)學習筆記(一) - 抽象類別、對象介面、instanceof 和契約式編程