PHPトレイトでオーバーロード

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){
// $data の処理
}
}

class ConcreteAccess extends BaseAccess
{
//再定義できない
public function save($data, $detail) {
// $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){
// $data の処理
}
}

class ConcreteAccess
{
use BaseAccess;

//エラーにならない
public function save($data, $detail) {
// $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) {
// $data の処理
}

public function save($data){
$this->saveCore($data);
}
}

class ConcreteAccess
{
use BaseAccess;

public function save($data, $detail){
$this->saveCore($data);
// $detail の処理
}
}