PHP中trait的基礎語法

小編給大家分享一下PHP中trait的基礎語法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

10多年的肥東網(wǎng)站建設經(jīng)驗,針對設計、前端、開發(fā)、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。成都全網(wǎng)營銷的優(yōu)勢是能夠根據(jù)用戶設備顯示端的尺寸不同,自動調(diào)整肥東建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)公司從事“肥東網(wǎng)站設計”,“肥東網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。

 類中的某些成員如何才能被其他類使用呢?使用繼承的話,這繼承鏈也太長了,php提供了代碼復用技術trait。

1.定義Trait 是為類似 PHP 的單繼承語言而準備的一種代碼復用機制。trait可以使得單繼承語言拜托為了復用而不得不繼承的尷尬,讓面向?qū)ο?/code>變得更加純粹。

2.基礎語法

trait是一種類似class的關鍵字。

<?php
     trait Eat{
        public $a=10;      //trait內(nèi)允許有類的成員屬性(包括靜態(tài)屬性),成員方法(包括靜態(tài)方法)
        public static $b=666;
        //const c=3.14;       //trait內(nèi)不允許有常量
        protected $e;	//允許定義,但是實際不用
        private $f;
        public function getA()
        {
               echo $this->a,"<br>";
        }
        public static function getB()
        {
               echo self::$b,"<br>";
        }
    }
?>

trait是用來實現(xiàn)代碼的復用的,不可以被實例化也不可以被繼承(不是類)。

<?php
   trait Eat{}
  // $a=new Eat;//報錯
  //calss A extends Eat{}//報錯
?>

 3.trait的使用

trait只是一段代碼的集合,使用時必須要使用use進行引用。

<?php
    
    trait Eat{
        public $a=10;
        public static $b=666;
        //const c=3.14;
        public function getA()
        {
               echo $this->a,"<br>";
        }
        public static function getB()
        {
               echo self::$b,"<br>";
        }
    }
    
    class A{
        use Eat;


        public function getC()
        {
            echo $this->a,"<br>";
        }
    }

    $boy=new A();
    $boy->getC();
    $boy->getA();
    $boy->getB();
?>

一個類可以使用多個trait。

<?php
   trait A1{
   }
   trait A2{
   }
   class People{
     use A1,A2;
   }
?>

 4.trait使用的問題

   a.如果同時引入的多個trait中有同名屬性,那么會產(chǎn)生沖突。

<?php
    trait A1{
       public $a=11;
    }
    trait A2{
       public $a=22;
    }

    class A3{
        use A1,A2;//不允許同名屬性
        public function geta(){
            echo $this->a;
        }
    }

    $example=new A3();
  

?>

b.如果同時引入的多個trait中有同名方法,那么會產(chǎn)生沖突,有兩種方案解決如A3、A4。

<?php
    trait A1{
       public $a=11;
       public function eat(){
           echo "A1中eat()方法","<br>";
       }
    }
    trait A2{
       public $b=22;
       public function eat(){
        echo "A2中eat()方法","<br>";
      }
    }

    class A3{
        use A1,A2{
          A1::eat insteadOf A2; //A1中的eat替代A2中的eat
        }
    }
    class A4{
        use A1,A2{
            A1::eat insteadOf A2;//A1中的eat替代A2中的eat
            A2::eat as eat2;     //A2中的eat取別名eat2
          }
    }

    $example=new A3();
    $example->eat();
    $example=new A4();
    $example->eat2();
?>

c.同名覆蓋問題:如果類中有與引入的trait同名成員,會有不同處理:

  • 屬性:不允許重名,即類中不允許定義與trait中同名的成員屬性(靜態(tài)屬性也一樣)。

  • 方法:類覆蓋trait。

d.繼承覆蓋問題:如果類中在使用trait的同時,也是繼承自父類,而trait中與父類中有同名方法,那么trait中將覆蓋父類同名方法;如果要訪問父類方法,可以在trait同名方法中使用parent關鍵字訪問父類同名方法。

<?php
    trait Eat{
    public function eat(){
        echo 'Eat::eat';
    }
}
    class Human{
    public function eat(){
        echo 'Human::eat';
    }
}
//子類繼承父類同時使用trait
class Man extends Human{
    use Eat;
}

$m = new Man();
$m->eat();
?>

e.trait自己不能訪問,只是用來給其他類提供代碼復用的,因此允許類在使用trait時更高里面方法的訪問控制權:在as之后,使用目標訪問修飾限定符。

<?php
trait Eat{
    private function show(){
        echo 'eat';
    }
}
class Human{
    use Eat{
        show as public eshow;				
        //注意:as是用來設定別名的,雖然沒有同名show,但是系統(tǒng)認為show已經(jīng)存在,所以必須別名,權限的更改的方法不是
        //本尊
    }
}
$h = new Human();
$h->eshow();								//eat
?>

f.trait中可以使用抽象方法,用來規(guī)范使用類必須實現(xiàn)對應抽象方法:使用類要么為抽象類,要么就必須實現(xiàn)抽象方法。

<?php
   trait Eat{
     public function eat();		//抽象方法
   }
   abstract class Human{			
    use Eat;					//抽象類:可以不實現(xiàn)抽象方法
   }

   class Animal{
    use Eat;
    public function eat(){		//具體類:實現(xiàn)抽象方法
        echo 'Animal::eat';	
    }		
}
?>

以上是“PHP中trait的基礎語法”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

分享題目:PHP中trait的基礎語法
當前路徑:http://muchs.cn/article12/gedegc.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、網(wǎng)站設計電子商務、定制網(wǎng)站、自適應網(wǎng)站、品牌網(wǎng)站建設

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)