国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > 建站經驗 > 正文

PHP中的traits實現代碼復用使用實例

2024-04-25 20:34:11
字體:
來源:轉載
供稿:網友

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;

}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 黑水县| 吉木乃县| 辉南县| 梅河口市| 彭阳县| 尉犁县| 犍为县| 青岛市| 迁西县| 寻甸| 五大连池市| 夹江县| 筠连县| 康马县| 黎城县| 平乡县| 扎鲁特旗| 若尔盖县| 阳信县| 永济市| 准格尔旗| 浦县| 勃利县| 拉孜县| 鹿邑县| 当雄县| 绥棱县| 讷河市| 黎川县| 宁南县| 定州市| 阿拉善左旗| 盘锦市| 邢台县| 哈尔滨市| 通渭县| 丰城市| 尼玛县| 榆树市| 鄂伦春自治旗| 红桥区|