登入
首頁 所有文章 PHP PHP特徵機制介紹
長也   2018-05-22 16:07:16(1年前)    328點閱   1喜歡  0收藏
PHP特徵機制介紹  

何謂特徵機制?

PHP中的特徵機制是一個類別的局部實作(方法或屬性等),而且可以被多個類別同時使用;而特徵機制具有介面(定義類別可以做什麼)與模組化(不必重複篩寫程式碼)的特性。

從範例了解為何使用特徵機制

當今天我們有兩個較無關係的類別:人與車子,我希望他們都回報所在的地址資訊,我們有幾種做法可以實現:

建立共同類別並且繼承

這種做法必須強制兩個不相關的類別去繼承一個父類別,這種繼承關係是不良的。

建立一個共同介面

在上一篇"PHP物件導向觀念—介面(Interface)"一文中我們介紹了介面,這比起共同類別繼承的作法來得好,但是必須在人與車子的類別中實作,不符合程式碼重複使用的原則。

建立特徵機制

建立特徵機制可以使人與車子共同使用機制中所提供的方法,並實作位址的回報,請參考下列範例。

特徵機制的建立與使用

建立特徵機制

trait locate{

    protected $address;
    public function setAdd($address){
        $this->address=$address;
    }
    public function getAdd(){
        return $this->address;
    }
}

特徵機制使用trait關鍵字宣告,如同宣告介面與類別,當中實作兩種方法:setAdd設定目前位置、getAdd回傳目前位置。

使用特徵機制

class car{
    use locate;
    protected $color,$model;
    public function __construct($color,$model)
    {
        $this->color=$color;
        $this->model=$model;
    }
}

class human{
    use locate;
    protected $name,$age,$job;
    public function __construct($name,$age,$job)
    {
        $this->name=$name;
        $this->age=$age;
        $this->job=$job;
    }
}

在要使用的類別(人、車子)中,使用use關鍵字匯入特徵空間,與命名空間相同。但是差異最大的是,特徵空間是在類別中use,而命名空間則是在類別之外

而使用use關鍵字匯入特徵空間,PHP只是將特徵機制中的內容複製到類別定義之中,因此不會做任何的相容檢查;若在特徵機制中假設某種方法、屬性存在(未在特徵機制中定義),要確定類別中存在該方法或類別。

$car=new car("red","SUZUKI GSR150");
$human=new human("粥洞香","999","叫受");
$car->setAdd("狗雄市男子區騎男路2005號400樓");
echo "車子在:".$car->getAdd()."<br>";
$human->setAdd("狗雄市男子區創新路9487號");
echo "人在:".$human->getAdd();

上列程式碼完成了特徵機制的使用。

本文作者:長也

糾結與想不開的資管系學生,之前常碰PHP,現在常碰到的是Python,閒暇之餘就記錄一些筆記。

             

如要發表回覆,請先 登入

  2則回覆
  回覆於2018-05-22 16:34:32
回覆  #1

特徵機制算是interface強化嗎(含實做的)

長也   回覆於2018-05-22 16:44:20

可以算是吧,同時具有介面與抽象類別的特性