面向對象技術要求子類覆蓋重寫父類方法時,要保證子類方法的簽名與父類方法簽名一致。當然PHP也遵守這條約束,不過其中還有一些特別的地方。
由於對其他面向對象語言沒有深入的了解,所以不清楚這些特性(或陷阱)是不是PHP特有的。
方法簽名是由方法的名稱和它的每一個形參(按從左到右的順序)的類型和種類(值、引用或輸出)組成。
PHP重寫父類方法時,對參數的名稱沒,參數個數,參數類型的限制都有不同。
參數名稱:
PHP對參數名稱沒有限制。即下面代碼沒有問題:
class foo { public function test($a) { } } class bar extends foo { public function test($b) { } }
參數個數:
子類參數個數不得少於父類參數個數,但多出的參數必須為默認參數。例如
class foo { public function test($a) { } } class bar extends foo { public function test($b, $c = '') { } }
參數類型:
由於PHP是弱類型的語言,所以重寫父類方法只涉及對象類型和數組類型
class foo { public function test(stdClass $a, array $z) { } } class bar extends foo { public function test(stdClass $b, array $c) { } }
另,默認參數的值不同也是可以的
class foo { public function test($a, $z = '') { } } class bar extends foo { public function test($b, $c = null) { } }
