可変長の引数
そふぃのPHP入門 >> PHP言語リファレンス >> ユーザ定義関数 >> 可変長の引数

可変長の引数

引数を可変長に

PHP4からは引数を可変長にする事ができます。引数は複数指定できると書きましたが、今までのサンプルでは関数定義時にその関数で使用する引数の数も自動的に決められていました。

そのような関数ではなく、引数が1個の時もあるけど10個の時もある、というような関数を作成する事ができますが、これはPHPに元々用意されている関数を使用する事によって実現します。その為、今回はそれらの関数の使い方が主な説明になると思います。ちなみに、引数を可変長として扱う為の関数はPHP4で定義されました。

参考関数

  • func_num_args() ---- 関数に渡された引数の数を取得する
  • func_get_arg() ---- 関数の引数リストから要素を1つ取得する
  • func_get_args() ---- 関数の引数リストを配列として取得する

この3つをうまい事組み合わせて引数リストを作るわけですが、勘のいい人ならお気づきの通り配列を使う事になります。配列いや~~~~~!!って人もたくさんいると思いますが、配列だからってそんなに難しい処理をする訳ではないので配列が苦手な方でも大丈夫です。

ちなみに上記の3つの関数はすべて関数定義部の大括弧「{}」内、つまり関数の処理を記述する部分でしか使えません。他の場所で使おうとすると・・・・PHP君に警告を出されて怒られますのでユーザ定義関数内でのみ使ってくださいw。

func_num_args関数

func_num_args()関数は関数に渡された引数の数を返します。

使い方は、書式が分かる方は以下の書式をご覧頂いた方が早いです。分からない方は、その後ちゃんと解説してますので書式部分は飛ばして結構です(笑)

参考関数

書式

  • int func_num_args( void )

つまり、関数定義部で

  1. func_num_args();

とするだけです。引数は必要ありません。書式部分でvoidってなってる部分が、どのような引数を指定するかを表す部分ですが、「void」というのは直訳すると「空虚」とか「空間」、つまり何もないって意味になります。PHPの書式で使ってる場合の訳は「値なし」でいいですかね。とにかく、「引数値void=引数に何も指定しない」です。

ここまで話したのでついでに最初の「int」にも触れておきますが、これは返り値のデータ型を表してます。つまり、どんな型の値が表されるか、です。この場合は「int」ですので整数型(integer)です。この関数のように返り値の型が決まっている場合はいいのですが、複数の型を返す可能性のある関数では「mixed」なんて表し方をします。

参考 型について

書式の読み方が難しければ今は理解しなくて結構です。どーせPHP使ってるうちに嫌でも覚えますw。いい機会だったので思わず寄り道してしまいましたが、分からなければ今のところは紹介する関数を覚える方に専念して下さい。

  1. <?php
  2. function my_func1(){
  3.   echo func_num_args(); //引数の数を出力
  4. };
  5.  
  6. my_func1("a","b","c","d");
  7. ?>

出力結果

4

引数の数が出力されたと思います。func_num_args()関数の使い方はこれだけです。

func_get_arg関数

func_get_arg()関数は引数のリストから要素を1つ返す関数です。引数リストとは関数実行時に複数指定する引数を0から順にリストにしたものとでも考えてください。配列の考え方とまるっきり同じです。

参考関数

  • func_get_arg() ---- 関数の引数リストから要素を1つ取得する

書式

  • mixed func_get_arg( int arg_num )

func_get_arg()関数の引数として「引数の番号」を指定しますが、これは「ユーザ定義関数の引数リストのうち何番目の引数か」という事です。この引数はあくまで整数値で指定します。引数リストから指定した番号(整数値)の要素を返します。引数リストは0から数える事に注意して下さい。

  1. <?php
  2. function my_func2(){
  3.   echo func_get_arg(1); //引数リストの1番目の要素出力
  4. };
  5.  
  6. my_func2("a","b","c","d");
  7. ?>

出力結果

b

1番目の引数が出力されたと思いますが(引数は0から数えます)、この関数を使用する際にさらに注意しなくてはならない事があります。実際の引数リストの数より、指定した「引数番号」の方が多いと、警告を発してfunc_get_arg()関数はFALSEを返します。

回避するためには関数の定義部に条件分岐をつけて、「アクセスする引数の番号」と「引数リストの数」を「同数もしくは引数リストの数の方が多い」時にのみ処理するようにしておくのが望ましいです。引数リストの数は先ほどのfunc_num_args()関数で取得できますね。

文章で説明してるだけだとこんがらがってくると思うのでサンプルを見ると分かるかもしれません。

  1. <?php
  2. function my_func3(){
  3.   $arg_num = func_num_args(); //引数の数取得
  4.   $key = 2; //アクセスする引数の番号
  5.  
  6.   //引数の数が「引数の番号+1」以上あった場合のみ処理
  7.   //+1するのは引数リストが0から数えられるため
  8.   if ($arg_num >= $key+1) {
  9.     //3番目の引数を指定:引数リストは0から数えるので$keyは2
  10.     echo "3番目の引数:".func_get_arg($key);
  11.   };
  12.  
  13. };
  14.  
  15. my_func3("a","b","c","d");
  16. ?>

出力結果

3番目の引数:c

このようにしておけば、間違えて引数リストの数より多い値の引数番号にアクセスしようした場合でも警告を発する事はありません。自分で作成したエラーメッセージを出力するようにしておいてもいいかと思います。

サンプルは慣れないうちはややこしいでしょうが、がんばって読み解いてみてください。通常では数を数える時には1から始めますが、プログラムでは0から数える事が多いです。その辺で随分頭がこんがらがるでしょうが、まぁ・・・慣れるまでの辛抱です。慣れてもたまにこんがらがります^^;。

func_get_args関数

さて、いよいよ最後の関数です。func_get_args()関数はユーザ定義関数の引数リストを全て配列にして返してくれます。

参考関数

  • func_get_args() ---- 関数の引数リストを配列として取得する

書式

  • array func_get_args( void )

いよいよ配列の登場ですが、使い方もすごく簡単です。引数も取りませんので、func_num_args()関数と同様

  1. func_get_args()

とするだけで引数を全て配列としてくれます。

  1. <?php
  2. function my_func4(){
  3.   $arg_arr = func_get_args();
  4.  
  5.   //配列なので<pre>タグ付きのprint_r関数で出力します。
  6.   echo "<pre>";
  7.   print_r($arg_arr);
  8.   echo "</pre>";
  9. };
  10.  
  11. my_func4("a","b","c","d","e");
  12. ?>

出力結果

Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => d
    [4] => e
)

参考関数

  • print_r() ---- 指定した式に関する情報を解りやすく出力する

書式

  • bool print_r( mixed expression [, bool return ] )

可変長の引数値を全て出力

さて、今挙げたような関数をどのように使っていいか分からない人もいるかと思うので、引数リストを全て出力するサンプルだけ載せておきます。出来上がったら引数の数を変えて試してみて下さい。

  1. <?php
  2. function my_func5(){
  3.   $arg_num = func_num_args(); //引数の数取得
  4.   $key = 0; //アクセスする引数番号
  5.   $arg_list = func_get_args(); //引数リストを配列に格納
  6.  
  7.   if($arg_num >= $key+1){ //引数番号以上のリスト数があれば出力
  8.     echo func_get_arg($key)."行:";
  9.   };
  10.  
  11.   for($i=0;$i<$arg_num;$i++){ //引数の数分ループ
  12.     echo $arg_list[$i];
  13.   };
  14. };
  15. my_func5("","","","","");
  16. ?>

出力結果

あ行:あいうえお

このサンプルでは引数にか行以降を追加してもか行:かきく・・・のような出力にはなりません。念のため。そういったスクリプトはサンプルがこれ以上長くなる上に「可変長の引数」って本筋から遠ざかるのであえて書いてないです。引数を可変にできてこのページで紹介した関数を全部使えるってサンプルを出したかっただけなんで、別に「あいうえお」じゃなくも良かったのですが他に思いつかなかったんです(笑)。適当に引数を増やしたり減らしたりして遊んでみて下さい。