そーくのつれづれぶろぐ

web系エンジニアの勉強したことなど

【PHP7】関数の引数のデフォルト値の振る舞いを見てみる

動機

JavaからPHPを学び始めたが、Javaの感覚で書くと言語仕様(理解不足)による不具合を生み出しそうという感覚があるため、入門書を読みながら挙動を確認している。学んでいる中でJavaと違う点として、引数にデフォルト値が設定できるとのことなので、デフォルト値を設定有無×関数呼び出し時の引数の数のバリエーションを試してみた。

結論

  • 関数に渡した引数の数 < デフォルト値を設定していない引数の数 の場合はFatal Errorになり後続処理は実行されない
  • 少なくとも引数の一番最後以外にデフォルト値を設定しても、設定していないのと同じ挙動になる
    • func($num1, $num2) イコール func($num1=5, $num2)

(あと今回とは話がそれるが、関数に渡した引数の数 > 関数定義で指定した引数の数 の場合は余剰分の引数は無視される)

ソース

<?php

function variable_1($msg) {
    print "variable_1: {$msg}<br/>";
}
function variable_1_op($msg="default") {
    print "variable_1_op: {$msg} <br/>";
}

function variable_2($msg1, $msg2) {
    print "variable_2: \$msg1: {$msg1} and msg2: {$msg2}<br/>";
}
function variable_2_op_1st($msg1="default1", $msg2) {
    print "variable_2_op_1st: \$msg1: {$msg1} and msg2: {$msg2}<br/>";
}
function variable_2_op_2nd($msg1, $msg2="default2") {
    print "variable_2_op_2st: \$msg1: {$msg1} and msg2: {$msg2}<br/>";
}
function variable_2_op_both($msg1="default1", $msg2="default2") {
    print "variable_2_op_both: \$msg1: {$msg1} and msg2: {$msg2}<br/>";
}

function variable_3_op_2nd($msg1, $msg2="default2", $msg3) {
    print "variable_2_op_2st: \$msg1: {$msg1} and msg2: {$msg2} and msg3: {$msg3}<br/>";
}

print "***********引数が1つの場合***********<br/>";
variable_1('msg');
//  variable_1(); // Fatal error: Uncaught ArgumentCountError: Too few arguments to function
variable_1_op('msg');
variable_1_op(); //defalt

print "***********引数が2つの場合***********<br/>";
print "***デフォルト設定なしのとき<br/>";
// variable_2(); //Fatal error: Uncaught ArgumentCountError: Too few arguments to function
// variable_2('msg1'); //Fatal error: Uncaught ArgumentCountError: Too few arguments to function
variable_2('msg1','msg2');
print "***デフォルトが第一引数に設定されているとき<br/>";
// variable_2_op_1st(); // Fatal error: Uncaught ArgumentCountError: Too few arguments to function
// variable_2_op_1st('msg1'); // Fatal error: Uncaught ArgumentCountError: Too few arguments to function
variable_2_op_1st('msg1','msg2');
print "***デフォルトが第二引数に設定されているとき<br/>";
// variable_2_op_2nd(); // Fatal error: Uncaught ArgumentCountError: Too few arguments to function
variable_2_op_2nd('msg1');
variable_2_op_2nd('msg1','msg2');
print "***デフォルトが両引数に設定されているとき<br/>";
variable_2_op_both();
variable_2_op_both('msg1');
variable_2_op_both('msg1','msg2');

print "***********引数が3つの場合***********<br/>";
print "***デフォルトが第二引数に設定されているとき<br/>";
variable_3_op_2nd('$msg1','$msg3'); //Fatal error: Uncaught ArgumentCountError: Too few arguments to function

雑感

C言語っぽさがでていて割とすんなりと挙動が頭に入った。(学生時代はC言語をやっていた)PHPC言語から作られていることを思い出させる内容だった。