溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何理解php是多繼承還是單繼承

發(fā)布時(shí)間:2021-10-19 09:35:56 來源:億速云 閱讀:134 作者:iii 欄目:編程語言

這篇文章主要講解了“如何理解php是多繼承還是單繼承”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“如何理解php是多繼承還是單繼承”吧!

php是單繼承。php是不支持多繼承的,但是php可以通過使用interface或者trait實(shí)現(xiàn)多繼承,如【interface test1 {public function connect();}interface test2 ...】。

如何理解php是多繼承還是單繼承

本文操作環(huán)境:windows10系統(tǒng)、php 7、thinkpad t480電腦。

php是單繼承還是多繼承?可能你也被這個(gè)問題困惑很久了吧。首先,PHP是單繼承,他是不支持多繼承的。面向?qū)ο蟮奶攸c(diǎn)是封裝、繼承、多態(tài)。這里的繼承是指類與類之間的繼承關(guān)系,可以使用關(guān)鍵字extends實(shí)現(xiàn),這里只可以繼承一個(gè)類。

那么,php是否可以實(shí)現(xiàn)多繼承呢?答案是可以的。

php可以用兩種方式實(shí)現(xiàn)多繼承。一個(gè)是使用interface實(shí)現(xiàn)。還有一個(gè)就是使用trait實(shí)現(xiàn)。

第一種:關(guān)于使用interface實(shí)現(xiàn),它的原理就是一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,我們可以定義多個(gè)接口類,如下:

interface test1 {
	public function connect();
}
interface test2 {
	public function contact();
}

一個(gè)類實(shí)現(xiàn)多個(gè)接口:

class MyClass implements test1,test2 {
	public function connect() {
		echo "test1";
	}
	public function contact() {
		echo "test2";
	}
}

第二種:使用trait實(shí)現(xiàn)。其實(shí)trait并不算是多繼承,應(yīng)該叫做類似多繼承的功能。

什么是trait呢?

答:看上去既像類又像接口,其實(shí)都不是,Trait可以看做類的部分實(shí)現(xiàn),可以混入一個(gè)或多個(gè)現(xiàn)有的PHP類中,其作用有兩個(gè):表明類可以做什么;提供模塊化實(shí)現(xiàn)。Trait是一種代碼復(fù)用技術(shù),為PHP的單繼承限制提供了一套靈活的代碼復(fù)用機(jī)制。

//基本類
  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();

注意:

優(yōu)先級:自身方法>trait的方法>繼承的方法(就是這樣子的。)
如果我們打開上述代碼中的注釋,會報(bào)錯(cuò),因?yàn)閮蓚€(gè)trait中的方法重名了。

如何解決trait中方法重名的情況?

//使用demo1和demo2的方法,但并不是導(dǎo)入命名空間
//demo1和demo2種都有hello方法
    use Demo1,Demo2{
        //將Demo1的hello方法替換Demo2的hello方法
        Demo1::hello insteadof Demo2;
        //給Demo2的hello方法起別名
        Demo2::hello as Demo2Hello;
    }
//下方調(diào)用的時(shí)候
return $this->hello(); // 使用demo1的方法
return $this->Demo2Hello();  //使用demo2的方法

感謝各位的閱讀,以上就是“如何理解php是多繼承還是單繼承”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對如何理解php是多繼承還是單繼承這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI