物件導向程式通過類的分層結構構建起來,在單重繼承語言如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...