PHP マニュアル
前のページ | 第 13 章 関数 | 次のページ

# 関数の引数

引数のリストにより関数へ情報を渡すことができます。 このリストは、カンマで区切られた変数や定数のリストです。

PHP は、値渡し(デフォルト)、 参照渡し、 デフォルト引数値 をサポートしています。可変長引数リストは、PHP 4以降でのみサポート されています。詳細は、 可変長引数リスト および func_num_args(), func_get_arg(), func_get_args() に関する関数リファレンスを 参照下さい。PHP 3でも関数に引数の配列を渡すことにより 同様の効果を得ることができます。

    function takes_array($input) {
        echo "$input[0] + $input[1] = ", $input[0]+$input[1];
    }

## 参照渡しで引数を作成する

デフォルトで、関数の引数は値で渡されます。(このため、関数の内部で 引数の値を変更しても関数の外側では値は変化しません。)関数がその引 数を修正できるようにするには、その引数を参照渡しとする必要があり ます。

関数の引数を常に参照渡しとしたい場合には、関数定義において アンパサンド(&) を引数名の前に付加することができます。

    function add_some_extra(&$string)
    {
        $string .= 'and something extra.';
    }
    $str = 'This is a string, ';
    add_some_extra($str);
    echo $str;    // 'This is a string, and something extra.' を出力します

## デフォルト引数値

関数は、スカラー引数に関して次のように C++ スタイルのデフォルト値を 定義することができます。

    function makecoffee ($type = "cappucino")
    {
        return "一杯の $type を作ります\n";
    }
    echo makecoffee ();
    echo makecoffee ("espresso");

上のコードにより、次のような出力が行われます。

    一杯の cappucino を作ります
    一杯の espresso を作ります

デフォルト値は、定数式である必要があり、 (例えば、)変数やクラスのメンバーであってはなりません。

引数のデフォルト値を使用する際には、デフォルト値を有する引数はデ フォルト値がない引数の右側に全てある必要があることに注意して下さ い。そうでない場合、意図したような動作が行われません。次の簡単な コードを見てみましょう。

    function makeyogurt ($type = "acidophilus", $flavour)
    {
        return "Making a bowl of $type $flavour.\n";
    }

    echo makeyogurt ("raspberry");   // 期待通りには動作しません

上記の例の出力は次のようになります。

    Warning: Missing argument 2 in call to makeyogurt() in
    /usr/local/etc/httpd/htdocs/php3test/functest.html on line 41
    Making a bowl of raspberry .

ここで、上の例を次のコードと比べてみましょう。

    function makeyogurt ($flavour, $type = "acidophilus")
    {
        return "Making a bowl of $type $flavour.\n";
    }

    echo makeyogurt ("raspberry");   // 期待通りに動作します

この例の出力は、次のようになります。

    Making a bowl of acidophilus raspberry.

## 可変長引数リスト

PHP 4 は、可変長引数をユーザー定義関数でサポートしています。 可変長引数の使用法は非常に簡単で、 func_num_args(), func_get_arg(), func_get_args() 関数を使用します。

可変長引数に関して特別な構文は必要としません。 引数リストは従来と同様に関数定義で明示的に指定することができ、 動作も従来と変わりません。

前のページ | ホーム | 次のページ
関数 | 上に戻る | 返り値