首頁  >  文章  >  後端開發  >  如何利用traits實現php程式碼復用

如何利用traits實現php程式碼復用

伊谢尔伦
伊谢尔伦原創
2017-07-03 11:27:381372瀏覽

這篇文章主要介紹了PHP中的traits實作程式碼重複使用實例,本文講解了Trait簡單使用、優先權問題、多個Trait衝突問題、as可用來修改方法存取控制、Trait中使用Trait等內容,需要的朋友可以參考下

PHP5.4後新增traits實現程式碼重複使用機制,Trait和類別相似,但不能被實例化,無需繼承,只需要在類別中使用關鍵字use引入即可,可引入多個Traits,用','隔開。

(1)Trait簡單使用

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

#(2)優先權問題
Trait會覆寫繼承的方法,目前類別會覆蓋Trait方法。

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

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

trait A {
  public function test() {
    echo &#39;A::test()&#39;;
  }
}
 
trait B {
  public function test() {
    echo &#39;B::test()&#39;;
  }
}
 
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 &#39;Hello World!&#39; ;
  }
}
 
// 修改 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 &#39;&#39;

(5)Trait中使用Trait

trait A {
  public function test1() {
    echo &#39;test1&#39;;
  }
}
 
trait B {
  public function test2() {
    echo &#39;test2&#39;;
  }
}
 
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;
}

以上是如何利用traits實現php程式碼復用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn