PHP8以降では、関数の引数に名前付きパラメータが使用可能です。
主なメリット
「名前付きパラメータ」の主なメリットは
- パラメータの役割が分かりやすくなる
- パラメータを書く順序が自由になる
- 省略可能なパラメータがあるときに、一部のパラメータの指定がしやすい
が上げられます。
パラメータの役割が分かりやすくなる
str_contains()
関数を例にしてみます。str_contains()
は、ある文字列(haystack)の中に別の文字列(needle)があるかを判定する関数です。
haystackは『干し草』の意味で、needleは『針』の意味です。英語では『needle in a haystack』という表現『干し草の中の針=探すのが非常に困難な人・物』があります。
名前付きパラメータを使って記述すると、↓のようになります。
<?php
$haystack = "abcdefg";
$needle = "d";
var_dump( str_contains(haystack:$haystack, needle:$needle) );
?>
『haystack 干し草』と『needle 針』が記述されていれば、検索範囲となる文字列・探したい文字列であることが明快で分かりやすくなります。
パラメータを書く順序が自由になる
PHP7.4以前では、関数の定義に従ってパラメータの順序を書く必要がありました。このため、str_contains()
関数の引数の順序が、『1つめ: haystack: 検索範囲となる文字列』『2つめ: needle: 探したい文字列』まで知っていれば良いですが、そうでないと、
<?php
$haystack = "abcdefg";
$needle = "d";
var_dump( str_contains($○○○, $○○○) );
?>
まで記述したとき、「どっちを先に書くのだっけ?」となってしまいます。
PHP8以降は、名前付きパラメータを使えば、順序を気にする必要はありません。
<?php
$haystack = "abcdefg";
$needle = "d";
var_dump( str_contains(haystack:$haystack, needle:$needle) );
// パラメータを書く順序は問わない ↑↓
var_dump( str_contains(needle:$needle, haystack:$haystack) );
?>
str_contains()
関数は、「Aの中にBが含まれるか?」ですが、「BがAの中に含まれるか?」であっても本質は変わらないですね。つまり、引数の順序はこの関数の本質ではありません。関数を呼び出すときに順序を気にしなくてもよくなるのは嬉しいですね。
省略可能なパラメータがあるときに、一部のパラメータの指定がしやすい
関数によっては、デフォルト値が設定されていることがあります。たとえばhtmlspecialchars()
関数は『string: エスケープしたい文字列』『flags: 動作を変更するフラッグ。デフォルトは ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401』『encoding:エンコーディング。デフォルトは null』『double_encode: 二重エンコードするか。デフォルトは true』です。
「二重エンコード」はデフォルトが true なので、
<?php
$string = '<abcde';
echo htmlspecialchars(string:$string); // 出力は「<lt;abcde」
?>
↑ のように、既にエンコード済みの値をhtmlspecialchars()
関数に渡すと二重エンコードされます。
これを「二重エンコードはしない」にしたい場合を考えてみましょう。名前付きパラメータを使うことで、
<?php
$string = '<abcde';
echo htmlspecialchars(string:$string, double_encode:false); // 出力は「<abcde」
?>
のように記述すればOKです。記載しなかったパラメータはデフォルト設定のままで、記載したパラメータは指定した設定が有効になります。
WordPress6.4 では名前付きパラメータ未使用
WordPress6.4は、PHP7以前でも動作するようにコードが書かれています。このため、WordPress6.4本体のコードでは、名前付きパラメータは使われていません。
テーマ・プラグインで名前付きパラメータを使う場合は
名前付きパラメータはPHP8以降の機能ですので、使用するテーマ・プラグインはPHP8以降が必須になります。
WordPressでは、readme.txt に、必須 PHP バージョンを書く仕組みになっています。テーマ・プラグインで名前付きパラメータを使う場合は、テーマ・プラグインの readme.txt に、
Requires PHP: 8.0
と記述しておきましょう。
更新日: