PHP では、継承元クラスの関数を派生先でオーバーロードできません。
例えばの下記 1. の記述はエラーになります。
オーバーロードを実現するためにトレイトを使用する方法が考えられます。
2. ではトレイトを use するクラスにトレイトが持っている関数と同じ名前の関数を定義すると、元の関数が上書きされることを利用しています。但しこの記述では元の関数を呼び出せません。元の関数を呼び出すには、3. のように元の関数を呼び出す関数でラップして、呼び出す関数を上書きします。3. のように元の関数を呼び出す関数でラップして、呼び出す関数を上書きします。
1. オーバーロード不可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class BaseAccess { public function save($data){ } }
class ConcreteAccess extends BaseAccess { public function save($data, $detail) { } }
|
2. トレイトで関数を上書き
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| trait BaseAccess { public function save($data){ } }
class ConcreteAccess { use BaseAccess;
public function save($data, $detail) { } }
|
3. 元の関数を呼び出す
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| trait BaseAccess { protected function saveCore($data) { }
public function save($data){ $this->saveCore($data); } }
class ConcreteAccess { use BaseAccess;
public function save($data, $detail){ $this->saveCore($data); } }
|