php – 使用 use 解決數個 trait 遇到重複指定的方法、別名指定

<?php 
trait A 
{
    public function talk()
    {
        echo "Hello";
    }
}
 
trait B 
{
    public function talk()
    {
        echo "World";
    }
}
 
class talker 
{
    use A, B 
    {
        // B 的 talk() 覆蓋掉 A 的 talk()。
        B::talk insteadof A; 

        // 可以把 A 的 talk() 改為別名 alias_talk ,使之可以被呼叫。
        A::talk as alias_talk;
    }
}

$talker = new talker;
$talker->talk(); //輸出 World
$talker->alias_talk(); //輸出 Hello

trait A 跟 trait B 都有定義相同的 talk() ,talker 類別同時使用了特徵 A 跟特徵 B,那麼 talk() 就會產生衝突。

所以我們要使用 use 指定哪個特徵的 talk() 要替換哪個特徵的 talk()。

use A, B 
{
    // B 的 talk() 替換 A 的 talk()
    B::talk insteadof A; 
}

可以使用關鍵字 as 來做為 trait 方法的別名。如

A::talk as alias_talk;

 

 


發表迴響