引数のリストにより関数へ情報を渡すことができます。 このリストは、カンマで区切られた変数や定数のリストです。
PHP は、値渡し(デフォルト)、 参照渡し、 デフォルト引数値 をサポートしています。可変長引数リストは、PHP4以降でのみサポート されています。 詳細は、 可変長引数リスト および func_num_args, func_get_arg, func_get_args に関する関数リファレンスを 参照下さい。PHP3でも関数に引数の配列を渡すことにより 同様の効果を得ることができます。
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.' を出力します
変数へある変数を参照渡しとしたいが、デフォルトでは参照渡しではない 場合、関数コール時に引数名の前にアンパサンドを付加することができます。
function foo ($bar) { $bar .= ' and something extra.'; } $str = 'This is a string, '; foo ($str); echo $str; // 'This is a string, ' を出力します。 foo (&$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 を作ります
デフォルト値は、定数式である必要があり、 (例えば、)変数やクラスのメンバーであってはなりません。
PHP 4.0 においては、デフォルト引数に unset を 指定することも可能です。これは、値が指定されない場合、 その引数が全く設定されないことを意味します。
デフォルト引数を使用する場合、全てのデフォルト値は、 デフォルト値としない引数の右側にある必要があります。 そうしないと、期待通りの動作は得られないでしょう。 次の短いコードを見てみましょう。
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.
PHP4 は、可変長引数をユーザー定義関数でサポートしています。 可変長引数の使用法は非常に簡単で、 func_num_args, func_get_arg, func_get_args 関数を使用します。
可変長引数に関して特別な構文は必要としません。 引数リストは従来と同様に関数定義で明示的に指定することができ、 動作も従来と変わりません。