PHP 快速導覽 - Trait 機制之基礎應用

特徵機制 (trait) 屬於特別的類別 (class) 與介面 (interface) 的融合體,利於程式碼的重複使用,像類別的地方在於可定義屬性 (property) 與方法 (method) ,像介面的地方在於不能建立物件 (object) 與可使用多個特徵機制。



舉例如下
<?php
trait Demo {
    public $a = 22;
    
    public function do_something() {
        echo "hello";
    }
}

class Demo2 {
    use Demo;
}

$d = new Demo2();
echo $d->a . "\n";
echo $d->do_something();

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:class10.php
    功能:示範 PHP 程式 
    作者:張凱慶
    時間:西元 2013 年 2 月 */
?>


特徵機制使用關鍵字 trait 定義
trait Demo {


之後使用該特徵機制 Demo 的類別,利用 use 便可重複利用 Demo 定義好的屬性與方法
class Demo2 {
    use Demo;
}


執行結果如下



也像類別可實作多個介面一樣,單一類別可 use 多個特徵機制,若是數個特徵機制中有相同名稱的方法,就須額外指定用哪個特徵機制中的方法,例如
<?php
trait Demo3 {
    public function do_something() {
        echo "hello";
    }
}

trait Demo4 {
    public function do_something() {
        echo "yes";
    }
}

class Demo5 {
    use Demo3, Demo4 {
        Demo3::do_something insteadof Demo4;
    }
}

$d = new Demo5();
echo $d->do_something();

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:class11.php
    功能:示範 PHP 程式 
    作者:張凱慶
    時間:西元 2013 年 2 月 */
?>


Demo3Demo4 都有相同名稱的 do_something() ,此時需要在 use 加上大括弧指定用哪個特徵機制的 do_something()
use Demo3, Demo4 {
    Demo3::do_something insteadof Demo4;
}


先寫特徵機制名稱,然後作用域運算子加上方法名稱,接著 insteadof 與不使用的特徵機制名稱,此例執行結果如下



中英文術語對照
特徵機制trait
類別class
介面interface
屬性property
方法method
物件object


您可以繼續參考
類別與物件


相關目錄
回 PHP 快速導覽
回 PHP 教材
回首頁


參考資料
http://www.php.net/manual/en/language.oop5.traits.php

沒有留言: