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,就很需要一些經驗了。