PHP中的traits實(shí)現(xiàn)代碼復(fù)用使用實(shí)例
PHP5.4后新增traits實(shí)現(xiàn)代碼復(fù)用機(jī)制,Trait和類(lèi)相似,但不能被實(shí)例化,無(wú)需繼承,只需要在類(lèi)中使用關(guān)鍵詞use引入即可,可引入多個(gè)Traits,用','隔開(kāi)。
(1)Trait簡(jiǎn)單使用
<?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)優(yōu)先級(jí)問(wèn)題
Trait會(huì)覆蓋繼承的方法,當(dāng)前類(lèi)會(huì)覆蓋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)多個(gè)Trait沖突問(wèn)題
如果沒(méi)有解決沖突,會(huì)產(chǎn)生致命錯(cuò)誤;
可用insteadof來(lái)明確使用沖突中哪一個(gè)方法;
可用as操作符將其中一個(gè)沖突方法另起名;
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可用來(lái)修改方法訪問(wèn)控制
trait HelloWorld {
public function sayHello () {
echo 'Hello World!' ;
}
}
// 修改 sayHello 的訪問(wèn)控制
class A {
use HelloWorld { sayHello as protected; }
}
// 給方法一個(gè)改變了訪問(wèn)控制的別名
// 原版 sayHello 的訪問(wèn)控制則沒(méi)有發(fā)生變化
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支持抽象方法、支持靜態(tài)方法、不可以直接定義靜態(tài)變量,但靜態(tài)變量可被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可定義屬性,但類(lèi)中不能定義同樣名稱(chēng)屬性
trait A {
public $test1;
}
class B {
use A;
public $test2;
}
- PHP 實(shí)現(xiàn)代碼復(fù)用的一個(gè)方法 traits新特性
- PHP中的Trait 特性及作用
- PHP中trait使用方法詳細(xì)介紹
- 淺談PHP中的Trait使用方法
- PHP中Trait及其應(yīng)用詳解
- 簡(jiǎn)單談?wù)凱HP中的trait
- PHP Trait代碼復(fù)用類(lèi)與多繼承實(shí)現(xiàn)方法詳解
- 詳解PHP神奇又有用的Trait
- php 5.4 全新的代碼復(fù)用Trait詳解
- PHP的Trait機(jī)制原理與用法分析
- PHP中用Trait封裝單例模式的實(shí)現(xiàn)
- PHP Trait功能與用法實(shí)例分析
相關(guān)文章
PHP utf-8編碼問(wèn)題,utf8編碼,數(shù)據(jù)庫(kù)亂碼,頁(yè)面顯示輸出亂碼
老聲長(zhǎng)談,著是困惑很多人的問(wèn)題,如果處理不好,都是亂碼,說(shuō)這些話(huà)并不是我對(duì)編碼很精通,只是在這方面是得留神,自己總結(jié)了一點(diǎn)小經(jīng)驗(yàn)2013-04-04
php數(shù)組查詢(xún)?cè)匚恢玫膶?shí)例方法
在本篇文章里小編給大家整理的是一篇關(guān)于php數(shù)組查詢(xún)?cè)匚恢玫膶?shí)例方法,對(duì)此有興趣的朋友們可以跟著學(xué)習(xí)下。2022-01-01
PHP簡(jiǎn)單實(shí)現(xiàn)文本計(jì)數(shù)器的方法
這篇文章主要介紹了PHP簡(jiǎn)單實(shí)現(xiàn)文本計(jì)數(shù)器的方法,涉及PHP針對(duì)文本文件的簡(jiǎn)單判斷,讀取及寫(xiě)入等操作技巧,需要的朋友可以參考下2016-04-04
收集的PHP中與數(shù)組相關(guān)的函數(shù)
收集的PHP中與數(shù)組相關(guān)的函數(shù)...2007-03-03
zend framework配置操作數(shù)據(jù)庫(kù)實(shí)例分析
zend framework項(xiàng)目建立后,看了下zend framework配置操作數(shù)據(jù)庫(kù),本文將詳細(xì)介紹,需要了解的朋友可以參考下2012-12-12
PHP實(shí)現(xiàn)單鏈表翻轉(zhuǎn)操作示例
這篇文章主要介紹了PHP實(shí)現(xiàn)單鏈表翻轉(zhuǎn)操作,結(jié)合實(shí)例形式分析了php單鏈表的定義、遍歷、遞歸、翻轉(zhuǎn)等相關(guān)操作技巧,需要的朋友可以參考下2017-12-12
PHP中函數(shù)gzuncompress無(wú)法使用的解決方法
這篇文章主要介紹了PHP中函數(shù)gzuncompress無(wú)法使用的解決方法,文中的介紹的很詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-03-03

