引数の型によって処理分けする関数の定義

折角だしPHPのお話でも。

たとえばPerlで下記のような仕様のsum関数を作るとする。

 print sum(1,2,3,4);   # 10
 print sum([1,2,3,4]); # 10

引数がリストならそれらを全て合計して返す。
引数が配列のリファレンスなら配列のリファレンスの中身を合計して返す。

つまり引数の型によって処理分けをするような関数ですね。
これをPerlで書くと、

 sub sum {
     my @param = ref $_[0] eq 'ARRAY' ? @{+shift} : @_;
     my $sum   = 0;
     foreach my $n (@param) {
         $sum += $n;
     }
     return $sum;
 }

まぁだいたいこんな感じですね。

これをPHPでやるとすると普通の引数の受け取り方だと無理なのでfunc_get_arg関数やfunc_get_args関数を駆使します。

 function sum () {
     $param = ( is_array(func_get_arg(0)) ) ? func_get_arg(0) : func_get_args();
     $sum   = 0;
     foreach($param as $n){
         $sum += $n;
     }
     return $sum;
 }
 print sum(1,2,3,4);        // 10
 print sum(array(1,2,3,4)); // 10

PHPなのにいかにもPerlらしいsum関数ができあがりましたね。

しかし、PHPでこういうPerlっぽくコードを書く人は嫌われやすい傾向にあるらしいのであまりPerlベースでやりすぎないように気をつけよう。