PHP 快速導覽 - 繼承

繼承 (inheritance) 為物件導向程式設計 (object-oriented programming) 的特性之一,子類別 (subclass) 可以承接父類別 (superclass) 的 publicprotected 成員 (member) ,使之具有共通的 publicprotected 成員。



「繼承」是物件導向程式設計中一個重要也是核心的觀念,動詞原文為 inherit 。雖然 inherit 在英文的意思泛指從什麼得到什麼,用作中文「繼承」說得通,也能用作「遺傳」。然而中文的「繼承」隱含某物不再,另物將起的意思,譬如「我繼承某某的精神」,雖然某某不見得已死,未來將要付出努力的卻是我而非某某。因而這裡的意思中文用「遺傳」比較恰當,子代會從親代遺傳某些生物特性,子代與親代也會並存一段時間,這就沒有某物不再的意含了。然而這裡我們仍沿用程式設計常用的「繼承」一詞,但仍提出意見以免讀者混淆。


舉例如下
<?php
class Demo {
    private $a = "superclass_a";
    protected $b = "superclass_b";
    public $c = "superclass_c";
    
    function do_something() {
        echo "a: $this->a, b: $this->b, c: $this->c\n";
    }
}

class Demo2 extends Demo {
    function do_something() {
        echo "a: $this->a, b: $this->b, c: $this->c\n";
    }
}

$o = new Demo2();
$o->do_something();

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:class04.php
    功能:示範 PHP 程式 
    作者:張凱慶
    時間:西元 2013 年 2 月 */
?>


Demo2 繼承自 Demo ,繼承的寫法是在子類別後面接 extends ,然後是父類別名稱
class Demo2 extends Demo {
    function do_something() {
        echo "a: $this->a, b: $this->b, c: $this->c\n";
    }
}


Demo 中已經有定義 do_something() 方法 (method) , Demo2 再次定義相同名稱 do_something() 會改寫父類別的 do_something() ,因此子類別的物件呼叫 do_something() 會是子類別定義的版本。


執行結果如下



屬性 (property) $a 沒有被印出,這是因為 $a 在父類別 Demoprivate 成員,因此子類別 Demo2 並沒有繼承 $a ,就 Demo2 而言, $a 為一個沒有被定義的屬性。


中英文術語對照
繼承inheritance
物件導向程式設計object-oriented programming
子類別subclass
父類別superclass
成員member
方法method
屬性property


您可以繼續參考
類別與物件


相關目錄
回 PHP 快速導覽
回 PHP 教材
回首頁


參考資料
http://www.php.net/manual/en/language.oop5.basic.php
http://www.php.net/manual/en/language.oop5.visibility.php
http://www.php.net/manual/en/language.oop5.inheritance.php

沒有留言: