php – 不同類別在實作 Interface 方法的時候,如何帶入為定義的參數
以下介紹兩種方法都可以達到目的
方法一、在類別的方法使用 NULL
1 2 3 4 5 6 |
Interface MemberInterface { public function getName(); } |
1 2 3 4 5 6 7 8 9 |
class Member implements MemberInterface { public function () { return "Cary"; } } |
如果希望在 getName() 的時候修改回傳 “A001 – Cary”,那麼可以在方法帶入的參數使用預設值 null 來符合介面定義,修改如下
1 2 3 4 5 6 7 8 9 |
class Member implements MemberInterface { public function getName($id = null) { return "{$id} - Cary"; } } |
1 2 3 4 |
$member = new Member(); echo $member->getName("A001"); |
方法二、透過 Setter
保持介面定義的方法樣式,但為了填入參數,我們必須要製作另外一個方法來寫入類別屬性,例如修改為
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class Member implements MemberInterface { public function setId($id) { $this->id = $id; } public function getName() { $id = $this->id; return "{$id} - Cary"; } } |
1 2 3 4 5 |
$member = new Member(); $member->setId("A001"); echo $member->getName(); |
比較兩者
方法一,適合用在 只定義方法名稱 但不定義寫入的參數要長甚麼樣子。因為都直接定義在類別的方法中,因此比較一目了然。
1 2 3 4 5 6 7 |
$memberA = new MemberA(); $memberA->getName("A001"); // 接手人 A 可能這樣寫,結果一個禮拜後離職 $memberB = new MemberB(); $memberB->getName("B001"); // 外包商接手人 B,參考 A 很直覺得會使用這種方法 |
方法二,因為 setId() 方法並沒有定義在 Interface,是依照各個類別自行應用。在不同類別,要使用 getName() 的時候,需要使用的寫法可能會不一樣。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$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,就很需要一些經驗了。