引数のリストにより関数へ情報を渡すことができます。 このリストは、カンマで区切られた式のリストです。 引数の評価は、左から右の順番で行われます。
PHP は、値渡し(デフォルト)、 参照渡し、 デフォルト引数値 をサポートしています。また、 可変長引数リスト もサポートしてます。
例1 Passing arrays to functions
<?php
function takes_array($input)
{
echo "$input[0] + $input[1] = ", $input[0]+$input[1];
}
?>
デフォルトで、関数の引数は値で渡されます。(このため、関数の内部で 引数の値を変更しても関数の外側では値は変化しません。)関数がその引 数を修正できるようにするには、その引数を参照渡しとする必要があり ます。
関数の引数を常に参照渡しとしたい場合には、関数定義において アンパサンド(&) を引数名の前に付加することができます。
例2 Passing function parameters by reference
<?php
function add_some_extra(&$string)
{
$string .= 'and something extra.';
}
$str = 'This is a string, ';
add_some_extra($str);
echo $str; // outputs 'This is a string, and something extra.'
?>
関数は、スカラー引数に関して次のように C++ スタイルのデフォルト値を 定義することができます。
例3 関数におけるデフォルトパラメータの使用法
<?php
function makecoffee($type = "cappuccino")
{
return "Making a cup of $type.\n";
}
echo makecoffee();
echo makecoffee(null);
echo makecoffee("espresso");
?>
上の例の出力は以下となります。
Making a cup of cappuccino. Making a cup of . Making a cup of espresso.
PHPでは、配列および特殊な型 NULL
をデフォルト値とすることも可能です。
例えば、
例4 スカラー型以外をデフォルト値として使用する
<?php
function makecoffee($types = array("cappuccino"), $coffeeMaker = NULL)
{
$device = is_null($coffeeMaker) ? "hands" : $coffeeMaker;
return "Making a cup of ".join(", ", $types)." with $device.\n";
}
echo makecoffee();
echo makecoffee(array("cappuccino", "lavazza"), "teapot");
?>
デフォルト値は、定数式である必要があり、 (例えば) 変数やクラスのメンバーであってはなりません。
引数のデフォルト値を使用する際には、デフォルト値を有する引数はデ フォルト値がない引数の右側に全てある必要があることに注意して下さ い。そうでない場合、意図したような動作が行われません。次の簡単な コードを見てみましょう。
例5 関数の引数のデフォルト値の 間違った使用法
<?php
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/phptest/functest.html on line 41 Making a bowl of raspberry .
ここで、上の例を次のコードと比べてみましょう。
例6 関数の引数のデフォルト値の 正しい使用法
<?php
function makeyogurt($flavour, $type = "acidophilus")
{
return "Making a bowl of $type $flavour.\n";
}
echo makeyogurt("raspberry"); // 期待通り動作します
?>
上の例の出力は以下となります。
Making a bowl of acidophilus raspberry.
注意: PHP 5以降では、リファレンス渡しの引数にもデフォルト値を指定できます。
PHP は、可変長引数をユーザー定義関数でサポートしています。 PHP 5.6 以降では ... を使って実装されており、 PHP 5.5 以前では func_num_args(), func_get_arg(), func_get_args() 関数を使用します。
PHP 5.6 以降では、引数リストに ... トークンを含めることで、 その関数が可変長の引数を受け取ることを示せます。 引数は、指定した変数に配列として渡されます。次の例を参照ください。
例7 ... を使った、可変長引数へのアクセス
<?php
function sum(...$numbers) {
$acc = 0;
foreach ($numbers as $n) {
$acc += $n;
}
return $acc;
}
echo sum(1, 2, 3, 4);
?>
上の例の出力は以下となります。
10
関数を呼び出すときに ... を使うと、 配列変数や Traversable クラスを引数リストに含めることができます。
例8 引数での ... の使用例
<?php
function add($a, $b) {
return $a + $b;
}
echo add(...[1, 2])."\n";
$a = [1, 2];
echo add(...$a);
?>
上の例の出力は以下となります。
3 3
通常の引数を、... の前に指定することもできます。 この場合は、通常の引数リストにマッチしなかったのこりの引数が ... による配列に追加されます。
... トークンの前に、 タイプヒント を付加することもできます。 タイプヒントがある場合、... が取り込むすべての引数はそのヒントに従わなければいけません。
例9 タイプヒントつきの可変長引数
<?php
function total_intervals($unit, DateInterval ...$intervals) {
$time = 0;
foreach ($intervals as $interval) {
$time += $interval->$unit;
}
return $time;
}
$a = new DateInterval('P1D');
$b = new DateInterval('P2D');
echo total_intervals('d', $a, $b).' days';
// これは失敗します。null は DateInterval オブジェクトではないからです。
echo total_intervals('d', null);
?>
上の例の出力は以下となります。
3 days Catchable fatal error: Argument 2 passed to total_intervals() must be an instance of DateInterval, null given, called in - on line 14 and defined in - on line 2
可変長引数の 参照渡し もできます。その場合は、... の前にアンパサンド (&) を付加します。
可変長引数に関して特別な構文は必要としません。しかし、関数の引数にアクセスするには func_num_args()、func_get_arg() および func_get_args() といった関数を使う必要があります。
先ほどの最初の例を、PHP 5.5 以前のバージョンで実装すると、以下のようになります。 earlier:
例10 可変長引数へのアクセス (PHP 5.5 以前)
<?php
function sum() {
$acc = 0;
foreach (func_get_args() as $n) {
$acc += $n;
}
return $acc;
}
echo sum(1, 2, 3, 4);
?>
上の例の出力は以下となります。
10