なるの備忘録

エンジニアリングそして営業ができるエンジニアに向けて、日々学んだことをアウトプットしていきます。

初期値が入っている関数に新たに変数を追加するときの注意点(PHP Fatal error: Uncaught ArgumentCountError: Too few arguments to function)

実施したいこと

元々用意していた関数では機能が足りなくて、変数を追加したい状況はよくあると思います。
以下の関数に新しい変数$var_eを追加する場合を例に考えます。

元々の関数

function hogehoge($var_a = 1, $var_b, $var_c, $var_d =10){
}

関数を使用するコード

$var_a = 1; 
$var_b = 2;
$var_c = 3;
$test_value = hogehoge($var_a, $var_b, $var_c);

エラーが発生したコード

引数を追加した関数

function hogehoge($var_a = 1, $var_b, $var_c, $var_d =10, $var_e){
}

変数を追加したコード

$var_a = 1; 
$var_b = 2;
$var_c = 3;
$var_c = 4;
$test_value = hogehoge($var_a, $var_b, $var_c, $var_e);

発生したエラー「PHP Fatal error: Uncaught ArgumentCountError: Too few arguments to function hogehoge()」

引数が少ない?ちゃんと関数を呼び出す側でも引数は渡しているんだけど…

修正したコード

修正した関数

function hogehoge($var_a = 1, $var_b, $var_c, $var_e, $var_d =10){
}

関数を使用するコード(特に変更なし)

$var_a = 1; 
$var_b = 2;
$var_c = 3;
$test_value = hogehoge($var_a, $var_b, $var_c, $var_e);

関数側の引数の順番を変更することで無事動作しました。

結論

「関数側で引数の初期値を持たせていて、呼び出す側で変数を渡さない」場合、関数側の引数の順番に注意する必要があります。変数を渡さない引数に関しては、関数の最後に設定しましょう。
関数は引数に初期値が入っているかを意識せず、記載順に頭から変数が入っているかを確認していくようです。今回の場合だと、4番目の引数まで値が入っているかを確認した後に5番目の引数が足りないぞ、とエラーを吐くようですね。