国产探花免费观看_亚洲丰满少妇自慰呻吟_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;

}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 天祝| 界首市| 吉林省| 浑源县| 綦江县| 乡宁县| 石嘴山市| 酉阳| 五大连池市| 滨海县| 丹寨县| 凭祥市| 桂阳县| 通州区| 高尔夫| 丰顺县| 呼伦贝尔市| 金坛市| 崇州市| 吴旗县| 丰顺县| 麦盖提县| 玉龙| 定安县| 南岸区| 侯马市| 光泽县| 宁德市| 平遥县| 五家渠市| 中阳县| 蒙自县| 阳城县| 沾益县| 湄潭县| 漳浦县| 繁昌县| 玉环县| 枣阳市| 封丘县| 茶陵县|