名前付き引数でbool地獄から抜け出す

名前付き引数はPHP 8の機能で、関数呼び出し時に引数を名前で指定できる書き方です。bool値が並ぶ呼び出しの可読性を上げたり、途中の引数だけを変更したりできます。

関数呼び出しでtrue, false, null, true みたいな引数が並んでいて、「これ何のフラグだっけ」となった経験はないでしょうか。PHP 8の名前付き引数はこれを解決します。

何を渡しているか呼び出し側で分かる

// 何のフラグか読めない
createUser('田中', true, false, true);

// 名前付きなら一目瞭然
createUser(
    name: '田中',
    isAdmin: true,
    sendMail: false,
    active: true,
);

定義側を見に行かなくても、呼び出しだけで意図が読めます。

途中の引数だけ指定できる

デフォルト値のある引数がたくさんあるとき、後ろのほうだけ変えたいケースで特に効きます。

function connect($host = 'localhost', $port = 3306, $timeout = 30, $ssl = false) {}

// timeoutだけ変えたい。従来は前の引数も全部書く必要があった
connect(timeout: 60);

注意点

引数名はAPIの一部になります。つまり後方互換を保つなら、引数名を安易にリネームできなくなります。ライブラリを公開している場合は特に意識しておくポイントです。あと、位置引数と名前付き引数を混ぜるときは、位置引数を先に書く必要があります。

まとめ

bool引数が並ぶ関数や、デフォルト値の多い関数の呼び出しで名前付き引数は効きます。ただ、そもそも引数が多すぎる関数は設計を見直すサインでもあるので、名前付き引数で読みやすくする前に「この引数、オブジェクトにまとめられないか」も一度考えてみるといいと思います。

よくある質問

Q. 位置引数と名前付き引数は混ぜられますか。
A. 混ぜられますが、位置引数を先に書く必要があります。名前付きより後ろに位置引数を置くことはできません。

Q. 引数名は後からリネームしても大丈夫ですか。
A. 名前付き引数では引数名がAPIの一部になるので、公開しているコードだと後方互換を壊します。安易なリネームは避けたほうが無難です。

類似投稿

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です