PHP5 0物件模型探索之抽象方法和抽象類

2021-05-22 15:53:15 字數 2321 閱讀 7177

物件導向程式通過類的分層結構構建起來,在單重繼承語言如php中,類的繼承是樹狀的. 乙個根類有乙個或更多的子類,再從每個子類繼承出乙個或更多下一級子類。當然,可能存在多個根類,用來實現不同的功能。在乙個良好設計的體系中,每個根類都應該有乙個有用的介面, 可以被應用**所使用。如果我們的應用**被設計成與根類一起工作,那麼它也可以和任何乙個從根類繼承出來的子類合作。

抽象方法是就像子類中一般的方法的佔位符(占個地方但不起作用),它與一般方法不同—沒有任何**。如果類中存在乙個或更多抽象方法, 那麼這個類就成了抽象類。你不能例項化抽象類. 你必須繼承它們,然後例項化子類,你也可以把抽象類看成是子類的乙個模板。

如果你覆寫所有的抽象方法,子類就變成乙個普通的類。如果沒有覆寫所有方法, 子類仍是抽象的. 如果乙個類中中包含有抽象方法(哪怕只有乙個), 你必須宣告這個類是抽象的, 在class關鍵字前加上abstract。

宣告抽象方法的語法與宣告一般方法不同,抽象方法的沒有像一般方法那樣包含在大括號{}中的主體部份,並用分號;來結束。

在例子6.13中,我們定義了乙個含有getarea方法的類shape。但由於不知道形狀不可能確定圖形的面積,確良我們宣告了getarea方法為抽象方法。你不能例項化乙個shape物件,但你可以繼承它或在乙個表示式中使用它,就像例6.13中那樣。

如果你建立了乙個只有抽象方法的類,你就定義了乙個介面(inte***ce)。為了說明這種情況,php中有inte***ce 和implements關鍵字。你可以用inte***ce來代替抽象類,用implements來代替extends來說明你的類定義或使用乙個介面,例如, 你可以寫乙個myclass implements myite***ce. 這兩種方法可以依個人偏愛來選擇。

/*注:

兩種方法即指:

1. abstract class aaa{} (注意aaa中只有抽象方法,沒有一般方法)

class bbb extends aaa{} (在bbb中覆寫aaa中的抽象方法)

2. inte***ce aaa{}

class bbb implements aaa{} (在bbb中覆寫aaa中的抽象方法)

*/listing 6.13 abstract classes

//abstract root class 抽象根類

abstract class shape

//abstract child class 抽象子類

abstract class polygon extends shape //多邊形

//concrete class 實體類 三角形類

class ******** extends polygon

public function getnumberofsides() //覆寫邊數統計方法 }

//concrete class 實體類四邊形

class rectangle extends polygon

public function getnumberofsides() }

//concrete class 實體類 圓形

class circle extends shape }

//concrete root class 定義乙個顏色類

class color

$mycollection = array(); //建立形狀的集合,放入陣列

//make a rectangle

$r = new rectangle;

$r->width = 5;

$r->height = 7;

$mycollection = $r;

unset($r);

//make a ********

$t = new ********;

$t->base = 4;

$t->height = 5;

$mycollection = $t;

unset($t);

//make a circle

$c = new circle;

$c->radius = 3;

$mycollection = $c;

unset($c);

//make a color

$c = new color;

$c->name = "blue";

$mycollection = $c;

unset($c);

foreach($mycollection as $s)

if($s instanceof polygon)

if($s instanceof color)

print("n");

}

PHP 5 0物件模型深度探索之繫結

除了限制訪問,訪問方式也決定哪個方法將被子類呼叫或哪個屬性將被子類訪問.函式呼叫與函式本身的關聯,以及成員訪問與變數記憶體位址間的關係,稱為繫結。在計算機語言中有兩種主要的繫結方式 靜態繫結和動態繫結。靜態繫結發生於資料結構和資料結構間,程式執行之前.靜態繫結發生於編譯期,因此不能利用任何執行期的資...

PHP 5 0物件模型深度探索之屬性和方法

乙個物件例項的屬性是變數,就像php的其他變數一樣。但是你必須使用 運算子來引用它們。不需要在屬性前使用美元符 可以聯用 如果乙個物件的屬性包含了乙個物件,你可以使用兩個 運算子來得到內部物件的屬性.你甚至可以用雙重引用的字串來放置這些表示式.下面的例子中,物件house中的屬性room包含了一組r...

PHP 5 0物件模型深度探索之構造和析構

如果你在乙個類中宣告乙個函式,命名為 construct,這個函式將被當成是乙個建構函式並在建立乙個物件例項時被執行。清楚地說,是兩個下劃線。就像其它任何函式一樣,建構函式可能有引數或者預設值.你可以定義乙個類來建立乙個物件並將其屬性全放在乙個語句 statement 中。你也可以定義乙個名為 de...