溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

php中的traits有什么用

發(fā)布時(shí)間:2020-07-01 16:30:49 來源:億速云 閱讀:160 作者:元一 欄目:編程語言

php中的traits有什么用?針對這個(gè)問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。

簡介

Traits是面向?qū)ο缶幊讨惺褂玫囊环N概念,它表示一組可用于擴(kuò)展類功能的方法。Traits提供了一組實(shí)現(xiàn)行為的方法,并要求來實(shí)現(xiàn)一組參數(shù)化所提供行為的方法。對于對象間的通信(以及對象之間的共享),特性在面向?qū)ο蟮膮f(xié)議(接口)和mixin之間有所不同。界面可以通過方法簽名來定義一個(gè)或多個(gè)行為,而特征通過完整的方法定義來定義行為:即,它包括方法的主體。相比之下,mixin包含完整的方法定義,并且還可以通過成員變量攜帶狀態(tài),而特征通常不會。

使用

首先看下官方文檔給出的例子:

<?php
trait ezcReflectionReturnInfo {
    function getReturnType() { /*1*/ }
    function getReturnDescription() { /*2*/ }
}
class ezcReflectionMethod extends ReflectionMethod {
    use ezcReflectionReturnInfo;
    /* ... */
}
class ezcReflectionFunction extends ReflectionFunction {
    use ezcReflectionReturnInfo;
    /* ... */
}
?>

從上面的例子可以看出,特性集ezcReflectionReturnInfo包含了兩個(gè)方法:getReturnTypegetReturnDescription,而下面的兩個(gè)子類分別繼承自不同的父類,卻可以通過use ezcReflectionReturnInfo來復(fù)用這兩個(gè)方法。簡單方便。

注意事項(xiàng)

  • 如果子類、父類、use的traits中存在重名方法,那么這三個(gè)方法的優(yōu)先級為:子類 > tratis > 父類;

  • 可以同時(shí)use多個(gè)traits,但不可use重名的traits;

  • 如果use的多個(gè)traits中存在方法名沖突,可以使用指定某個(gè)方法來自于某個(gè)tratis。例如:

<?php
trait A {
    public function smallTalk() {
        echo 'a';
    }
    public function bigTalk() {
        echo 'A';
    }
}
trait B {
    public function smallTalk() {
        echo 'b';
    }
    public function bigTalk() {
        echo 'B';
    }
}
class Talker {
    use A, B {
        B::smallTalk insteadof A;
        A::bigTalk insteadof B;
    }
}
  • 方法可以使用as來設(shè)置別稱,但只在該類有效。

class Aliased_Talker {
    use A, B {
        B::smallTalk insteadof A;
        A::bigTalk insteadof B;
        B::bigTalk as talk;
    }
}
  • 使用as的時(shí)候,還可以改變方法的可見性。

class MyClass2 {
    use HelloWorld { sayHello as private myPrivateHello; }
}
  • traits可以嵌套,例如A可以use B。

<?php
trait Hello {
    public function sayHello() {
        echo 'Hello ';
    }
}
trait World {
    public function sayWorld() {
        echo 'World!';
    }
}
trait HelloWorld {
    use Hello, World;
}
  • traits中可以定義abstract方法,同樣的,use該traits的class,也需要實(shí)現(xiàn)這些abstract的方法;

  • traits中可以定義常規(guī)變量、靜態(tài)的變量和方法;

關(guān)于php中的traits有什么用問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI