LoginSignup
35
36

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-03-07

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

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

yotsuba_s.jpg1)引数の数で分岐

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

  • 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

yotsuba_s.jpg2)引数のデフォルト値を利用

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

churippu_s.png おまけ

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

▼ideone.com
http://ideone.com/

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

http://ideone.com/qhUZPs
▼スクリーンショット
ideone_1.png

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

以上です。

35
36
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35
36