皆さん、「オーバーロード」という言葉は知っていますか?
Javaなど他の言語を学んだ方の中には、「オーバーロード」という機能に馴染みがあるかもしれません。
しかしPHP初心者にとっては、オーバーロードの機能自体が難しく感じる事でしょう。
結論から言いますと、
PHPでオーバーロードは使えない!
です。
しかし、工夫をすればオーバーロード的な機能を実装することができます。
そこで今回はPHP初心者に向けて、
- ・オーバーロードとは何か?
- ・オーバーロードを実装する3つの方法
を紹介します。
PHP初心者がつまづきやすいポイントを分かりやすく解説します。
オーバーロードっていまいち分からない方は、ぜひ最後まで読んで理解を深めてくださいね。
オーバーロードとは
まずは、「オーバーロード」とは何かから説明しましょう。
オーバーロードとは、
引数違いの関数を複数定義する方法
です。
例えば、足し算をする例で考えましょう。
引数にとる数字を全て足してみます。
1 2 3 4 5 6 7 8 |
function cal($num1, $num2){ $num = $num1 + $num2; echo $num; } function cal($num, $num2, $num3){ $num = $num1 + $num2 + $num3; echo $num; } |
このコードはエラー Fatal error: Cannot redeclare cal() といわれ動きません。
PHPでは、同名の関数を複数定義することはできません。
では、どうすればこの処理を実現できるでしょうか?
ここでは、3つの方法をご紹介します。
引数の数で条件分岐させる方法
まずは、引数の数で処理を分岐させる方法です。
使うのは func_num_args( ) と func_get_args() です。
1 2 3 4 5 6 7 8 9 10 11 |
function cal(){ $args = func_num_args( ) // 引数の数を数える $num = func_get_args() // 引数一覧を配列へ変換する $ans = ""; // 計算結果を入れる変数を用意 if($args === 2){ $ans = $num[0] + $num[1]; }else if($args === 3){ $ans = $num[0] + $num[1] + $num[2]; } echo $ans; } |
ここでは
- func_num_args()を使って関数cal()に渡された引数の数を数えて、
- func_get_args()を使って引数を配列$numに収納し、
- 数字が2個の場合、3個の場合と場合分けをして処理
このような流れの処理になっています。
条件が少ない場合はこれでも良いですが、引数の数が多い場合は書くのが大変です。
可変長引数リストを利用する方法
PHP5.6以降では、「可変長引数リスト」という仕組みが使えます。
書き方は、関数の引数の前に「…(3点ピリオド)」を付けます。
可変長引数リストとは、
- ・関数が可変長(数が変動する)変数を受け取ることができる。
- ・変数を配列として渡す。
というものです。
先ほどのコードを書き直してみましょう。
1 2 3 4 5 6 7 |
function cal(...$nums){ $ans = ""; // 計算結果を入れる変数を用意 foreach($nums as $num){ // foreachで配列を1つずつ取り出す $ans += $num; } echo $ans; } |
このように、関数を使わずに簡潔に書くとこができます。
デフォルト値を利用する方法
最後は、引数のデフォルト値を使う方法です。
こちらは、あらかじめ引数に値を設定しておき、引数が呼び出されない場合はデフォルト値を使うというものです。
1 2 3 4 5 6 |
function call($name, $hello = 'こんにちは'){ echo $hello.'、'.$name.'さん'; } call('山田'); // こんにちは、山田さん call('田中', 'こんばんは'); // こんばんは、田中さん |
このように、$helloに対応する引数が呼ばれないときは、デフォルト値の’こんにちは’が呼ばれることになります。
厳密にはオーバーロードとは異なりますが、便利な使い方ですの覚えておきましょう。
まとめ
今回はPHPのオーバーロードにおいて、
- ・オーバーロードとは
- ・PHPでオーバーロードを実現する3つの方法
を解説しました。
オーバーロードは必ずしも使う必要はないですが、使えると便利な機能ですので理解できるようにしておきましょう。