主頁(yè) > 知識(shí)庫(kù) > PHP Trait代碼復(fù)用類(lèi)與多繼承實(shí)現(xiàn)方法詳解

PHP Trait代碼復(fù)用類(lèi)與多繼承實(shí)現(xiàn)方法詳解

熱門(mén)標(biāo)簽:400電話蘭州申請(qǐng)請(qǐng) 開(kāi)發(fā)地圖標(biāo)注類(lèi)網(wǎng)站 咸寧銷(xiāo)售電銷(xiāo)機(jī)器人系統(tǒng) 電銷(xiāo)機(jī)器人問(wèn)門(mén)薩維品牌my 余姚電話機(jī)器人 百度地圖怎樣標(biāo)注圖標(biāo) 廣東廣州在怎么申請(qǐng)400電話 外呼系統(tǒng)能給企業(yè)帶來(lái)哪些好處 百度地圖標(biāo)注偏差

本文實(shí)例講述了PHP Trait代碼復(fù)用類(lèi)與多繼承實(shí)現(xiàn)方法。分享給大家供大家參考,具體如下:

前言

眾所周知,一直以來(lái)PHP和很多語(yǔ)言一樣是單繼承的語(yǔ)言,但是常常在編碼過(guò)程中,我們需要在當(dāng)前類(lèi)中使用兩個(gè)或兩個(gè)以上的其他類(lèi)的方法,這種情況下繼承就不能實(shí)現(xiàn),而往往采用new方式實(shí)例化很多要用到的類(lèi),這樣就會(huì)很影響代碼的結(jié)構(gòu)和開(kāi)發(fā)規(guī)范。于是Trait類(lèi)誕生了,它是一種代碼復(fù)用的語(yǔ)法,能夠?qū)崿F(xiàn)一個(gè)類(lèi)中引用多個(gè)其他類(lèi)的方法。

一、概念

PHP官方手冊(cè)對(duì)Trait的描述是:
Trait是為類(lèi)似PHP的單繼承語(yǔ)言而準(zhǔn)備的一種代碼復(fù)用機(jī)制。Trait為了減少單繼承語(yǔ)言的限制,使開(kāi)發(fā)人員能夠自由地在不同層次結(jié)構(gòu)內(nèi)獨(dú)立的類(lèi)中復(fù)用method。Trait和Class組合的語(yǔ)義定義了一種減少?gòu)?fù)雜性的方式,避免傳統(tǒng)多繼承和Mixin類(lèi)相關(guān)典型問(wèn)題。
Trait和Class相似,但僅僅旨在用細(xì)粒度和一致的方式來(lái)組合功能。無(wú)法通過(guò)trait自身來(lái)實(shí)例化。它為傳統(tǒng)繼承增加了水平特性的組合;也就是說(shuō),應(yīng)用的幾個(gè)Class之間不需要繼承。

二、Trait類(lèi)的使用

簡(jiǎn)單地講,Trait就是一種不同于繼承的語(yǔ)法,定義一個(gè)trait類(lèi),在其他類(lèi)中使用它則是采用use關(guān)鍵字,有點(diǎn)類(lèi)似于命名空間的用法,但是含義不同。use關(guān)鍵字在一個(gè)類(lèi)中引入Trait類(lèi)后,相當(dāng)于require或include了一段代碼進(jìn)來(lái),不同之處在于use的Trait類(lèi)與當(dāng)前類(lèi)是可以看做同一個(gè)類(lèi)的,即當(dāng)前類(lèi)可以用$this關(guān)鍵字調(diào)用Trait類(lèi)的方法。

以下是原理解釋?zhuān)?/p>

可以看出當(dāng)前類(lèi)可以簡(jiǎn)單地use兩個(gè)Trait類(lèi),并調(diào)用其中的方法,而不僅限于繼承,只能使用一個(gè)父類(lèi)的方法。

三、Trait類(lèi)的訪問(wèn)控制

我們知道,繼承的方式,如果基類(lèi)是private修飾控制的,則子類(lèi)是無(wú)法調(diào)用的。但是Trait不一樣,因?yàn)樗?lèi)似于Require到當(dāng)前類(lèi)中了,所以不管是public、protected或private都是可以直接使用的。示例如下:

四、Trait類(lèi)的優(yōu)先級(jí)控制

Trait類(lèi)與當(dāng)前使用類(lèi)、繼承的基類(lèi)之間的調(diào)用優(yōu)先級(jí)順序如下:
當(dāng)前使用類(lèi)>Trait類(lèi)>繼承的基類(lèi)

當(dāng)存在同名方法時(shí),會(huì)根據(jù)優(yōu)先級(jí)覆蓋掉同名的類(lèi)。具體示例如下:

1、Trait類(lèi)覆蓋基類(lèi)

2、當(dāng)前類(lèi)覆蓋Trait類(lèi)

五、多個(gè)Trait類(lèi)的沖突控制

在PHP中,如果當(dāng)前類(lèi)use了兩個(gè)Trait類(lèi),同時(shí)兩個(gè)trait類(lèi)都存在一個(gè)同名的方法,此時(shí)如果沒(méi)有明確解決沖突將會(huì)產(chǎn)生一個(gè)致命錯(cuò)誤。
對(duì)于這種情況,PHP官方給出了兩個(gè)解決方案:
1、insteadof關(guān)鍵字:通過(guò)該關(guān)鍵字指定方法名沖突時(shí)該使用哪個(gè)Trait類(lèi)的方法,即:
如果C類(lèi)use了A、B兩個(gè)Trait類(lèi),且A、B兩個(gè)類(lèi)都存在a、b方法,則在C類(lèi)use A、B類(lèi)時(shí)使用insteadof聲明沖突的解決方法即可:

use A, B {
  B::a insteadof A; //a方法沖突時(shí)使用B類(lèi)的a方法而不使用A類(lèi)的a方法
  A::b insteadof B; //b方法沖突時(shí)使用A類(lèi)的b方法而不使用B類(lèi)的b方法
}

2、as關(guān)鍵字:通過(guò)as關(guān)鍵字將同名方法指定為一個(gè)別名,且僅作用于當(dāng)前類(lèi)中。示例如下:

use A, B {
  B::a as c; //聲明B類(lèi)的a方法為c,作用于該類(lèi)
  A::b as d; //聲明A類(lèi)的b方法為d,作用于該類(lèi)
}

六、與繼承、直接實(shí)例化的區(qū)別

對(duì)于當(dāng)前一個(gè)類(lèi)需要用到另一個(gè)或多個(gè)類(lèi)的方法的情況,我們一般會(huì)想到的方式有繼承、直接實(shí)例化另外一個(gè)或多個(gè)類(lèi)等等的方法,下面來(lái)對(duì)比一下這些方法和Trait類(lèi)的區(qū)別:
1、繼承方式:對(duì)于繼承,可以完美地復(fù)用另一個(gè)類(lèi)的一些方法,但是對(duì)于需要復(fù)用多個(gè)類(lèi)的方法時(shí),PHP是不支持多繼承的,而且只能訪問(wèn)public和protected方法;
2、與直接實(shí)例化的區(qū)別:我們也可以在當(dāng)前類(lèi)中直接實(shí)例化要用到的A類(lèi)與B類(lèi),但是這種方法在控制訪問(wèn)范圍反面,只允許訪問(wèn)A、B類(lèi)中public的方法;
3、使用Trait類(lèi)則完全將A、B兩個(gè)類(lèi)的方法導(dǎo)入到當(dāng)前類(lèi)中,可以視為當(dāng)前類(lèi)的一部分,唯一區(qū)別是可以存在于當(dāng)前類(lèi)同名的方法,此時(shí)由優(yōu)先級(jí)順序來(lái)控制。

補(bǔ)充:PHP多繼承示例

class Base{
  public function sayHello(){
    echo "hello ";
  }
}
trait SayWorld{
  public function sayHello(){
    parent::sayHello();
    echo "world".PHP_EOL;
  }
}
trait SayWorld2{
  public function sayHello2(){
    echo "PHP".PHP_EOL;
  }
}
class MyHelloWorld extends Base{
  use SayWorld,SayWorld2;
}
$s = new MyHelloWorld();
$s->sayHello();
$s->sayHello2();

輸出結(jié)果:

hello  world
PHP

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語(yǔ)法入門(mén)教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門(mén)教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》

希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。

您可能感興趣的文章:
  • PHP 實(shí)現(xiàn)代碼復(fù)用的一個(gè)方法 traits新特性
  • PHP中的Trait 特性及作用
  • PHP中trait使用方法詳細(xì)介紹
  • 淺談PHP中的Trait使用方法
  • PHP中Trait及其應(yīng)用詳解
  • 簡(jiǎn)單談?wù)凱HP中的trait
  • PHP中的traits實(shí)現(xiàn)代碼復(fù)用使用實(shí)例
  • 詳解PHP神奇又有用的Trait
  • php 5.4 全新的代碼復(fù)用Trait詳解
  • PHP的Trait機(jī)制原理與用法分析
  • PHP中用Trait封裝單例模式的實(shí)現(xiàn)
  • PHP Trait功能與用法實(shí)例分析

標(biāo)簽:十堰 重慶 鷹潭 臨沂 麗江 巴彥淖爾 銅陵 衡陽(yáng)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PHP Trait代碼復(fù)用類(lèi)與多繼承實(shí)現(xiàn)方法詳解》,本文關(guān)鍵詞  PHP,Trait,代碼,復(fù)用,類(lèi),與,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PHP Trait代碼復(fù)用類(lèi)與多繼承實(shí)現(xiàn)方法詳解》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于PHP Trait代碼復(fù)用類(lèi)與多繼承實(shí)現(xiàn)方法詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章