這篇文章主要介紹了PHP中的traits實現代碼復用使用實例,本文講解了Trait簡單使用、優先級問題、多個Trait沖突問題、as可用來修改方法訪問控制、Trait中使用Trait等內容,需要的朋友可以參考下
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;
- }
新聞熱點
疑難解答