最近一做php開發的朋友問了一個關於php多重繼承的問題,兩個人說了半天,其實自己也沒有搞懂什麼是多重繼承,今天有空,特意將多重繼承這個概念給詳細的瞭解了一下,也來談談在php中實現多重繼承的一些看法。
說多重繼承之前首先說下與其相對的單一繼承,單一繼承指的是一個類只可以繼承自一個父類,從現實生活中舉例就是說一個兒子只有一個父親。那麼多重繼承就好理解了,多重繼承指的是一個類可以同時從多於一個父類繼承行為與特徵的功能。這個有逆常理,即一個兒子可以有多個父親。由於多重繼承是物件導向程式設計語言中所特有的特性,所以在php5之前是沒有什麼繼承這一說了。但在php中,即使php5也只是實現了單繼承。但是我們可以通過其它特殊的方式實作類別的多重繼承,比如使用介面(interface),只要把類的特徵抽象為介面,並通過實現介面的方式讓對象有多重身份,通過這樣就可以在php中類比多重繼承了。
下面通過一個執行個體來說明一下如何在php中實現多重繼承,具體代碼如下:
<?phpinterface UserInterface{ //定義User的介面function getname();}interface TeacherInterface{ //teacher相關介面function getLengthOfService();}class User implements UserInterface{ //實現UserInterface介面private $;public function getName(){return $this->name;}}class Teacher implements TeacherInterface{ //實現TeacherInterface介面private $lengthOfService=5; // 工齡public function getLengthOfService(){return $this->lengthOfService;}}// 繼承自User類,同時實現了TeacherInterface介面.class GraduateStudent extends User implements TeacherInterface{private $teacher ;public function __construct(){$this->teacher=new Teacher();}public function getLengthOfService(){return $this->teacher->getLengthOfService();}}class Act{//注意這裡的類型提示改成了介面類型public static function getUserName(UserInterface $_user){echo "Name is " . $_user->getName() ."<br>";}//這裡的類型提示改成了TeacherInterface類型.public static function getLengthOfService(TeacherInterface $_teacher){echo "Age is " .$_teacher->getLengthOfService() ."<br>";}}$graduateStudent=new GraduateStudent();Act::getUserName($graduateStudent);Act::getLengthOfService($graduateStudent);//結果正如我們所要的,實現了有多重身份的一個對象
樣本運行結果如下:
Name is tom
Age is 5
另外不得不說明的一下是多重繼承在實際開發中會增加程式的複雜性與含糊性,非常不利於代碼的調試。所以在開發中能夠想辦法用單繼承的來實現的東西最好避免使用多重繼承。