PHP中的traits實現代碼複用使用執行個體_PHP

來源:互聯網
上載者:User
關鍵字 PHP traits 代碼複用 使用執行個體
PHP5.4後新增traits實現代碼複用機制,Trait和類相似,但不能被執行個體化,無需繼承,只需要在類中使用關鍵詞use引入即可,可引入多個Traits,用','隔開。

(1)Trait簡單使用

<?php trait A {  public $var1 = 'test1';  public function test1() {    echo 'trait A::test1()';  }} trait B {  public $var2 = 'test2';  public function test2() {    echo 'trait B::test2()';  }} class C {  use A,B;} $c = new C();echo $c->var1; //test1$c->test2(); //trait B::test2()

(2)優先順序問題
Trait會覆蓋繼承的方法,當前類會覆蓋Trait方法。

trait A {  public $var1 = 'test';  public function test() {    echo 'A::test()';  }  public function test1() {    echo 'A::test1()';  }} class B {  public function test() {    echo 'B::test()';  }  public function test1() {    echo 'B::test1()';  }}class C extends B{  use A;  public function test() {    echo 'c::test()';  }} $c = new C();$c->test(); //c::test()$c->test1(); //A::test1()

(3)多個Trait衝突問題
如果沒有解決衝突,會產生致命錯誤;
可用insteadof來明確使用衝突中哪一個方法;
可用as操作符將其中一個衝突方法另起名;

trait A {  public function test() {    echo 'A::test()';  }} trait B {  public function test() {    echo 'B::test()';  }} class C {  use A,B {    B::test insteadof A;    B::test as t;  }} $c = new C();$c->test(); //B::test()$c->t(); //B::test()  可以用as另起名

(4)as可用來修改方法存取控制

trait HelloWorld {  public function sayHello () {    echo 'Hello World!' ;  }} // 修改 sayHello 的存取控制class A {  use HelloWorld { sayHello as protected; }} // 給方法一個改變了存取控制的別名// 原版 sayHello 的存取控制則沒有發生變化class B {  use HelloWorld { sayHello as private myPrivateHello ; }} $b = new A();$b->sayHello(); //Fatal error: Call to protected method A::sayHello() from context ''

(5)Trait中使用Trait

trait A {  public function test1() {    echo 'test1';  }} trait B {  public function test2() {    echo 'test2';  }} trait C {  use A,B;} class D {  use C;} $d = new D();$d->test2(); //test2

(6)Trait支援抽象方法、支援靜態方法、不可以直接定義靜態變數,但靜態變數可被trait方法引用。

trait A {  public function test1() {    static $a = 0;    $a++;    echo $a;  }   abstract public function test2(); //可定義抽象方法} class B {  use A;  public function test2() {   }} $b = new B();$b->test1(); //1$b->test1(); //2

(7)Trait可定義屬性,但類中不能定義同樣名稱屬性

trait A {  public $test1;} class B {  use A;  public $test2;}
  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.