php – 不同類別在實作 Interface 方法的時候,如何帶入為定義的參數

以下介紹兩種方法都可以達到目的

方法一、在類別的方法使用 NULL

Interface MemberInterface 
{
    public function getName();    
}
class Member implements MemberInterface 
{
    public function ()
    {
        return "Cary";
    }
}

如果希望在 getName() 的時候修改回傳 “A001 – Cary”,那麼可以在方法帶入的參數使用預設值 null 來符合介面定義,修改如下

class Member implements MemberInterface 
{
    public function getName($id = null)
    {
        return "{$id} - Cary";
    }
}
$member = new Member();
echo $member->getName("A001");

方法二、透過 Setter

保持介面定義的方法樣式,但為了填入參數,我們必須要製作另外一個方法來寫入類別屬性,例如修改為

class Member implements MemberInterface 
{
    public function setId($id)
    {
        $this->id = $id;
    }
    
    public function getName()
    {
        $id = $this->id;
        return "{$id} - Cary";
    }
}
$member = new Member();
$member->setId("A001");
echo $member->getName();

比較兩者

方法一,適合用在 只定義方法名稱 但不定義寫入的參數要長甚麼樣子。因為都直接定義在類別的方法中,因此比較一目了然。

$memberA = new MemberA();
$memberA->getName("A001"); // 接手人 A 可能這樣寫,結果一個禮拜後離職 

$memberB = new MemberB(); 
$memberB->getName("B001"); // 外包商接手人 B,參考 A 很直覺得會使用這種方法

方法二,因為 setId() 方法並沒有定義在 Interface,是依照各個類別自行應用。在不同類別,要使用 getName() 的時候,需要使用的寫法可能會不一樣。

$memberA = new MemberA();
$memberA->setId("A001"); // 接手人 A 可能這樣寫,結果一個禮拜後離職
echo $memberA->getName();

$memberB = new MemberB(); 
$memberB->setUserId("B001") // 外包商接手人 B 可能這樣寫,沒有依照 A 的命名樣式
echo $memberA->getName();

$memberC = new MemberC();
$memberC->id($id); // 接手人 C 可能剛學 PHP 一個月,接手處理這個問題
echo $memberC->getName();

// 接手人 D 整頓程式碼,就會 WTF ...

不過,最怕的當然還是方法一、方法二的混用的狀況啦,因此定義 Interface 要實作 setter 與 getter,就很需要一些經驗了。

發表迴響