《PHP8上級試験対策》func_get_args()と名前付き引数の落とし穴

  • URLをコピーしました!

はじめに

PHP8では「名前付き引数(Named Arguments)」が導入されましたが、func_get_args()と組み合わせるとエラーになるケースがあります。本記事では、なぜFatal error: Unknown named parameterが発生するのかを、試験対策の観点から丁寧に解説します。
「func_get_args()は名前付き引数と共存できるのか?」という重要な理解ポイントを整理しましょう。

キーワード: func_get_args / 名前付き引数 / Unknown named parameter / 可変引数 / PHP8仕様

目次

◆ func_get_args()とは

func_get_args() は、

「関数に渡されたすべての実引数の値を、**配列(数値キー)**として返す」
関数です。

つまり、次のように呼ぶと、引数リストがそのまま配列として取得できます。

function hoge() {
    $args = func_get_args();
    var_dump($args);
}

hoge(123, '2nd');

出力結果:

array(2) {
  [0]=>
  int(123)
  [1]=>
  string(3) "2nd"
}

ここまでは問題ありません。

◆ 名前付き引数を使うとどうなる?

次に、以下のように名前付き引数で呼び出してみます👇

function hoge() {
    $args = func_get_args();
    var_dump($args);
}

hoge(str: '2nd', num: 123);

◆ 実行結果

array(2) {
  [0]=>
  int(123)
  [1]=>
  string(3) "2nd"
}

Fatal error: Uncaught Error: Unknown named parameter $str ...

◆ なぜFatal errorが出るのか?

理由はシンプルです。

名前付き引数は、「関数定義にその名前のパラメータが存在する」場合にしか使えないためです。

上記の hoge() 関数には $str$num といったパラメータが定義されていません。
そのため、PHPは「そんな引数名は知らない!」としてエラーを投げます。

◆ 正しい書き方

関数にパラメータを定義した上で、名前付き引数を使いましょう👇

function hoge($num, $str) {
    $args = func_get_args();
    var_dump($args);
}

hoge(str: '2nd', num: 123);

出力結果:

array(2) {
  [0]=>
  string(3) "2nd"
  [1]=>
  int(123)
}

※ 呼び出し順に依存するため、順番は「str → num」となります。
そしてここでも、キーは名前ではなく 数値インデックス で返される点に注目です。

図解:func_get_args() × 名前付き引数の関係

┌──────────────────────────────┐
│ 定義されていない関数に str: を渡す │ → ❌ Fatal error
└──────────────────────────────┘

┌──────────────────────────────────────┐
│ function hoge($num, $str) {}         │ → ✅ 実行可能
│ hoge(str:'2nd', num:123);            │
│ func_get_args() → [0=>'2nd', 1=>123] │
└──────────────────────────────────────┘

🧠 試験対策ポイント

覚えるべき項目内容
名前付き引数の条件関数に同名の引数が定義されている必要がある
func_get_args() の戻り値値の配列(数値キー)で返される
名前情報の扱い保持されない(キーは 0,1,2…)
定義なしで名前付き引数を渡すと❌ Fatal error: Unknown named parameter
試験での注意点「func_get_args() は名前を保持する」と答えると誤り!

まとめ

  • func_get_args() は関数に渡された引数の値リストを返す。
  • 名前付き引数は、関数側に同名の引数が宣言されていなければ使えない。
  • 名前付き引数で呼び出すときは、関数側も $str, $num のように宣言が必要。
  • 試験では「名前付き引数とfunc_get_argsの共存」に関するひっかけに注意。

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次