PHP繼承
PHP菜鳥
以下都是我個人的理解,有錯的地方還望不吝賜教。
為什麼需要繼承?
繼承就是 一個子類通過extends父類把父類的屬性和方法繼承下來。
假設現在現在需要寫兩個類,小學生類和高中生類,小學生會說話,走路,考試,高中生也會說話走路,考試,那麼如果你寫兩遍說話,走路,考試,那麼就會顯得臃腫,管理起來也會麻煩很多,如果定義一個類叫做學生類包含說話,走路,考試,然後讓小學生類和高中生類來繼承這個學生類就會顯得好很多,比如這樣。
<?php class student{ function speak(){ echo '說話'; } function walk(){ echo '走路'; } function test(){ echo '考試'; } } class pupil extends student{ function test(){ echo '小學生考試'; } } class senior extends student{ function test(){ echo '高中生考試'; } } $pupil=new pupil(); $pupil->speak(); $pupil->walk(); $pupil->test(); echo '<br />'; $senior=new senior(); $senior->speak(); $senior->walk(); $senior->test(); ?>
輸出:
說話走路小學生考試 說話走路高中生考試
這樣程式碼管理起來就會好很多。
假設現在小學生要學習一個新的技能吃東西,我現在這樣寫。
<?php class student{ function speak(){ echo '說話'; } function walk(){ echo '走路'; } function test(){ echo '考試'; } } class skill{ function eat(){ echo '吃東西'; } } class pupil extends student,skill{ function test(){ echo '小學生考試'; } } $pupil=new pupil(); $pupil->speak(); $pupil->walk(); $pupil->test(); $pupil->eat(); ?>
如果這樣寫,那麼就會報錯:
Fatal error: Class 'studentskill' not found in D:\xampp\htdocs\1.php on line 18
因為php中是不能這樣實現多繼承的,如果想要實現多繼承可以這麼寫:
<?php class student{ function speak(){ echo '說話'; } function walk(){ echo '走路'; } function test(){ echo '考試'; } } class skill extends student{ function eat(){ echo '吃東西'; } } class pupil extends skill{ function test(){ echo '小學生考試'; } } $pupil=new pupil(); $pupil->speak(); $pupil->walk(); $pupil->test(); $pupil->eat(); ?>
輸出:
說話走路小學生考試吃東西
先用一個skill類繼承student類,然後再用pupil類繼承skill類,這樣就相當於pupil類繼承了student類和skill類。
方法重寫
如果要實現的兩個類有共同特徵,那麼就可以將這個共同的特徵抽象出一個父類。
比如,有小學生類和中學生類,這樣的兩個類,他們都是學生,那麼就可以抽象出一個學生類,學生都會考試,那麼就把考試這個方法寫在學生這個類裡面。
那麼問題就是,小學生是小學生的考試,中學生是中學生的考試,我不可能都輸出考試,這裡就用到了方法重寫。
在子類中定義一個與父類一樣的方法,這樣執行的時候,父類中的方法就會被覆蓋,從而輸出的只有子類中定義的方法。
舉例:
<?php class student{ function test(){ echo '考試'; } } class pupil extends student{ function test(){ echo '小學生考試'; } } class senior extends student{ function test(){ echo '中學生考試'; } } $pupil=new pupil(); $pupil->test(); echo '<br />'; $senior=new senior(); $senior->test(); ?>
輸出:
小學生考試 中學生考試