あっぽログ
← 記事一覧に戻る

PHPのnamed argumentsを使いこなす:名前付き引数で読みやすく安全な関数呼び出しを実現する

名前付き引数(Named Arguments)とは

PHP 8.0で導入された名前付き引数は、関数やメソッドを呼び出す際に、引数の位置ではなく引数名を指定して値を渡せる機能です。

従来の位置ベースの引数渡しと比べて、コードの可読性が大幅に向上し、オプション引数の扱いがシンプルになります。

<?php

// 従来の位置ベースの呼び出し
array_slice($array, 0, 5, true);

// 名前付き引数を使った呼び出し
array_slice(array: $array, offset: 0, length: 5, preserve_keys: true);

後者はパラメータ名が明示されているため、コードを読むだけで何を渡しているかが一目でわかります。


基本的な使い方

名前付き引数は 引数名: 値 の形式で指定します。

<?php

function createUser(string $name, int $age, string $role = 'user'): string
{
    return "{$name}({$age}歳) - ロール: {$role}";
}

// 位置ベース
echo createUser('田中太郎', 30, 'admin');

// 名前付き引数
echo createUser(name: '田中太郎', age: 30, role: 'admin');

// 順序を入れ替えても動作する
echo createUser(age: 30, role: 'admin', name: '田中太郎');

名前付き引数では順序を問わないのが大きなメリットです。引数の定義順を覚えていなくても、名前さえ正確であれば正しく動作します。


オプション引数のスキップ

名前付き引数の強力な使いどころの一つが、途中の省略可能な引数をスキップするケースです。

<?php

function sendEmail(
    string $to,
    string $subject,
    string $body,
    string $cc = '',
    string $bcc = '',
    bool $html = false
): void {
    echo "送信先: {$to}, 件名: {$subject}, HTML: " . ($html ? 'yes' : 'no');
}

// 従来:$ccや$bccにデフォルト値を渡す必要がある
sendEmail('user@example.com', 'テスト', '本文', '', '', true);

// 名前付き引数:$htmlだけ指定してスキップできる
sendEmail(
    to: 'user@example.com',
    subject: 'テスト',
    body: '本文',
    html: true
);

従来は中間の引数にデフォルト値をわざわざ書く必要がありましたが、名前付き引数を使えばスッキリ記述できます。


組み込み関数との組み合わせ

PHPの組み込み関数は引数が多かったり順序が直感的でないものも多く、名前付き引数との相性は抜群です。

<?php

// str_contains / str_starts_with など(PHP8〜)
$text = 'Hello, PHP8!';

// htmlspecialcharsの例
$safe = htmlspecialchars(
    string: '<script>alert("xss")</script>',
    flags: ENT_QUOTES,
    encoding: 'UTF-8'
);
echo $safe;
// &lt;script&gt;alert(&quot;xss&quot;)&lt;/script&gt;

// array_fillの例
$filled = array_fill(start_index: 0, count: 5, value: 'PHP');
print_r($filled);
// ['PHP', 'PHP', 'PHP', 'PHP', 'PHP']

引数名が意味を持つドキュメントの役割を果たすため、チームでの開発においても大きな効果を発揮します。


位置引数と名前付き引数の混在

位置引数と名前付き引数は混在させることができます。ただし、位置引数は先に書かなければなりません

<?php

function greet(string $greeting, string $name, string $suffix = 'さん'): string
{
    return "{$greeting}、{$name}{$suffix}!";
}

// OK:位置引数のあとに名前付き引数
echo greet('こんにちは', name: '鈴木', suffix: '様');
// こんにちは、鈴木様!

// NG:名前付き引数のあとに位置引数(エラー)
// echo greet(greeting: 'こんにちは', '鈴木'); // Fatal error

混在させる場合は順序に注意しましょう。


スプレッド演算子との組み合わせ

名前付き引数はスプレッド演算子 ... と組み合わせることもできます。連想配列のキーが引数名として使われます。

<?php

function makeTag(string $tag, string $content, string $class = ''): string
{
    $classAttr = $class ? " class=\"{$class}\"" : '';
    return "<{$tag}{$classAttr}>{$content}</{$tag}>";
}

$args = [
    'tag'     => 'p',
    'content' => 'Hello, PHP!',
    'class'   => 'text-bold',
];

echo makeTag(...$args);
// <p class="text-bold">Hello, PHP!</p>

設定を配列として外部から渡したいときに便利なパターンです。


注意点とベストプラクティス

引数名の変更には注意

名前付き引数を使うと、関数・メソッドの引数名を変えると呼び出し元が壊れる可能性があります。公開APIやライブラリでは特に注意が必要です。

<?php

// 変更前
function calculate(int $value, int $multiplier): int
{
    return $value * $multiplier;
}

// 変更後(引数名を変えた)
function calculate(int $num, int $factor): int  // 名前が変わった!
{
    return $num * $factor;
}

// 呼び出し元(名前付き引数を使っていると壊れる)
calculate(value: 10, multiplier: 3); // エラー!

可読性のために適切に使う

すべての引数に名前付き引数を使う必要はありません。引数が1〜2個の場合や意味が明確な場合は位置引数で十分です。引数が多いときや意味が不明瞭なブール値・数値を渡すときに特に効果的です。

<?php

// ブール値の意味が一目でわかる
setcookie(
    name: 'session',
    value: 'abc123',
    secure: true,
    httponly: true
);

まとめ

機能メリット
引数の名前指定コードの可読性向上
順序の自由引数定義順を覚えなくてよい
中間引数のスキップデフォルト値の省略が容易
スプレッド演算子との併用設定の動的な渡し方が柔軟

名前付き引数はPHP 8.0以降で使えるシンプルながら強力な機能です。特に引数が多い関数の呼び出し組み込み関数との組み合わせで真価を発揮します。ぜひ日常のコードに取り入れてみてください。

← 記事一覧に戻る