Edited at

PHPでのオーバーロード(引数ちがいの同名関数)

More than 3 years have passed since last update.

PHPではオーバーロードはサポートされていません。(オーバーロードとは、引数ちがいの同名関数を複数個定義することです)

ただ、1つの関数において色々と工夫することで、オーバーロード的なことは実現できます。2つの方法があります。


1)引数の数で分岐

関数に渡された引数の情報を知るための関数が色々用意されています。


  • func_num_args( ) ⇒ 引数の数を取得

  • func_get_arg(n) ⇒ n番目の引数の値を取得

  • func_get_args( ) ⇒ 引数の一覧を配列として取得

これらを駆使する事で、1つの関数に対して、色々な呼び出し方が可能になります。(ソースを精査しなくても済むよう、引数についてのコメント文はしっかり書いときましょう)

※ 注意点 ※

PHP 5.2 以前では、func_get_arg(n)を他の関数への引数として直接渡すことはできません。(エラーとなる)



PHP5.6以降は可変長引数リスト『...』が使える

コメントで教えて頂きましたように、PHP 5.6 以降は「可変長引数リスト」という仕組みが使えます。記号は、ピリオド3つの『...』です。


PHP

function sum(...$nums) {

$val = 0;
foreach ($nums as $n) {
$val += $n;
}
return $val;
}

echo sum(1, 2, 3, 4);


上記の出力結果は 10 となります。一部の引数を固定にしたり、呼び出し元に『...』を使うこともできます。詳細は下記ページをご覧下さい。

▼PHP 5.6 以降における ...(可変長引数リスト)

http://php.net/manual/ja/functions.arguments.php#functions.variable-arg-list


2)引数のデフォルト値を利用

PHPは引数のデフォルト値をサポートしています。引数を指定せずに呼び出した時は、自動的にデフォルト値がセットされます。


PHP

<?php

function myfunc($name = "hanako")
{
return "my name is $name\n";
}
echo myfunc("ichiro");
echo myfunc();
?>

出力結果:

my name is ichiro

my name is hanako


おまけ

オーバーロード関数を作る場合は、オンラインでPHPをテストできるツールが便利です。

▼ideone.com

http://ideone.com/

ページ左下の言語を「PHP」に変更してからお使い下さい。検証したコードはシェアもできるようです。(有効期限あるかも…)

http://ideone.com/qhUZPs

▼スクリーンショット

ページ左上の「fork」から再編集もできます。すわ!便利。

以上です。