1. 本記事のポイント
- PHPの関数定義における「引数のデフォルト値」と「可変長引数」の仕様を解説
- 基本構文から実務での使い方、注意点や組み合わせ方まで網羅
- 予期しない挙動やバージョン差による落とし穴も補足
2. PHPの引数のデフォルト値・可変長引数とは?
PHPの関数では、引数にデフォルト値を指定したり、引数の数が可変な関数を定義することができます。
デフォルト値は、引数が省略されたときに使用される初期値です。たとえば、function greet($name = "Guest")
のように定義すると、引数なしで呼び出しても $name
は “Guest” になります。
一方、可変長引数は ...$args
という構文で定義し、任意の個数の引数を受け取る機能です。これは、呼び出し時の柔軟性を高め、引数の数を限定しない関数を作るのに有効です。
実務では、ログ出力やフォーマット処理、ユーティリティ関数などで頻繁に使われます。これらの構文を正しく理解し、適切に組み合わせることで、より柔軟で堅牢な関数設計が可能になります。
3. 詳細解説
デフォルト値付き引数の基本構文と挙動
以下はデフォルト値を指定した基本的な関数定義です。
// デフォルト引数を指定
function greet($name = "Guest") {
echo "Hello, $name\n";
}
greet(); // 出力: Hello, Guest
greet("Taro"); // 出力: Hello, Taro
デフォルト値は、必ず右側(後方)の引数から順に指定する必要があります。左にデフォルト値あり・右に必須引数という順序はエラーになります。
// エラー例: デフォルト値のある引数が先にある
function invalid($a = 1, $b) {} // PHP Parse error
可変長引数の基本構文と用途
以下は、複数の引数を一括して配列として受け取る例です。
// 可変長引数を受け取る
function sum(...$numbers) {
return array_sum($numbers);
}
echo sum(1, 2, 3); // 出力: 6
echo sum(); // 出力: 0
...
を使うことで、任意の個数の引数が $numbers
に配列として渡されます。呼び出し時に引数を配列で渡すには、スプレッド構文 ...
を使います。
$data = [10, 20, 30];
echo sum(...$data); // 出力: 60
デフォルト値と可変長引数の組み合わせ
両者は同時に使用可能ですが、位置と初期値に注意が必要です。
// デフォルト値 + 可変長引数の併用
function notify($title = "Info", ...$messages) {
echo "[$title] ";
echo implode(", ", $messages) . "\n";
}
notify("Warning", "Disk full", "Try again"); // [Warning] Disk full, Try again
notify(); // [Info]
このように、デフォルト値の後ろに可変長引数を置くと柔軟性の高い関数が実現できます。
4. よくあるミス・誤解・落とし穴
引数の順序エラー
PHPでは、デフォルト値付き引数を先頭に置くと構文エラーになります。実装時には必ず「必須引数→デフォルト引数→可変長引数」の順に並べる必要があります。
引数の数と想定外の型
可変長引数に渡される値は常に配列で受け取られますが、関数内部で個々の引数として扱うつもりで実装すると誤動作の原因になります。意図的に foreach
や implode()
で配列処理を行いましょう。
デフォルト値が参照型・複雑型の場合
配列やオブジェクトをデフォルト値として使う場合、そのインスタンスは毎回共有されるため副作用を引き起こすことがあります。
function addItem($list = []) {
$list[] = "item";
print_r($list);
}
addItem(); // item
addItem(); // item(別インスタンスなので問題なし)
ただし、明示的に参照渡しした場合は注意が必要です。
5. まとめ
- PHPでは、引数にデフォルト値や可変長引数を指定することで柔軟な関数設計が可能
- デフォルト値は右側から、可変長引数は末尾に定義する
- 可変長引数は常に配列で渡されるため、配列として明示的に処理すること
- 型や参照の副作用にも注意が必要
構文の柔軟さと実行時の挙動の違いを把握して、実務に合った設計判断を行いましょう。