php是單繼承。 php是不支援多重繼承的,但是php可以透過使用interface或trait實現多重繼承,如【interface test1 {public function connect();}interface test2 ...】。
本文操作環境:windows10系統、php 7、thinkpad t480電腦。
php是單繼承還是多繼承?可能你也被這個問題困惑很久了吧。首先,PHP是單繼承,他是不支援多繼承的。物件導向的特徵是封裝、繼承、多型。這裡的繼承是指類別與類別之間的繼承關係,可以使用關鍵字extends實現,這裡只可以繼承一個類別。
那麼,php是否可以實現多繼承呢?答案是可以的。
php可以用兩種方式實作多重繼承。一個是使用interface實作。還有一個就是使用trait實作。
第一種:關於使用interface實現,它的原理就是一個類別可以實現多個接口,我們可以定義多個接口類,如下:
interface test1 { public function connect(); }
interface test2 { public function contact(); }
一個類別實現多個接口:
class MyClass implements test1,test2 { public function connect() { echo "test1"; } public function contact() { echo "test2"; } }
第二種:使用trait實作。其實trait不算是多繼承,應該叫做類似多繼承的功能。
什麼是trait呢?
答:看上去既像類又像接口,其實都不是,Trait可以看做類的部分實現,可以混入一個或多個現有的PHP類中,其作用有兩個:表明類別可以做什麼;提供模組化實作。 Trait是一種程式碼重複使用技術,為PHP的單一繼承限制提供了一套靈活的程式碼重複使用機制。
//基本类 class basicTest{ public function test(){ echo "hello,world\n"; } } //traitOne trait traitOne{ public function test(){ echo "this is trait one"; } public function testOne(){ echo "one"; } } //traitTwo trait traitTwo{ // public function test(){ // echo "this is trait two!"; // } public function testTwo(){ echo "Two"; } } //继承基本类,并use trait class myCode extends basicTest{ use traitOne,traitTwo; public function test(){ echo "hehaha!!"; } } $obj = new myCode(); $obj->testTwo();
注意:
優先:自身方法>trait的方法>繼承的方法(就是這樣子的。)
如果我們開啟上述程式碼中的註釋,會報錯,因為兩個trait中的方法重名了。
如何解決trait中方法重名的情況?
//使用demo1和demo2的方法,但并不是导入命名空间 //demo1和demo2种都有hello方法 use Demo1,Demo2{ //将Demo1的hello方法替换Demo2的hello方法 Demo1::hello insteadof Demo2; //给Demo2的hello方法起别名 Demo2::hello as Demo2Hello; } //下方调用的时候 return $this->hello(); // 使用demo1的方法 return $this->Demo2Hello(); //使用demo2的方法
推薦學習:php訓練
#以上是php是多繼承還是單繼承的詳細內容。更多資訊請關注PHP中文網其他相關文章!