【PHP8.x】compact関数の使い方

作成日: 更新日:

compact関数は、PHPにおいて、指定された変数名とその値から新しい連想配列を作成する関数です。この関数は、引数として一つ以上の文字列、または文字列の配列を受け取ります。各文字列は、現在利用可能なスコープ(ローカルスコープやグローバルスコープなど)にある変数の名前として解釈されます。

関数が実行されると、指定された変数名が連想配列のキーとなり、その変数に現在格納されている値が対応する値となる連想配列が生成され、戻り値として返されます。例えば、$nameという変数に"Alice"が、$ageという変数に30が格納されている場合、compact('name', 'age')を実行すると、['name' => 'Alice', 'age' => 30]のような配列が得られます。

この関数の主な用途は、複数の変数を効率的に一つの配列にまとめることです。これにより、特にテンプレートエンジンへのデータ渡しや、複数の引数を必要とする関数へのデータ準備など、コードをより簡潔に記述できるようになります。指定された変数名に対応する変数が存在しない場合でもエラーにはならず、単にその変数名は生成される配列に含まれません。システムエンジニアを目指す上で、変数管理をよりスマートに行うための便利なツールとして活用できます。

基本的な使い方

構文(syntax)

<?php
$name = "Alice";
$age = 30;
$user_info = compact("name", "age");
?>

引数(parameters)

string|array $var_names, string|array ...$var_names

  • string|array $var_names: 配列または文字列で、作成したい連想配列のキーとなる変数名を指定します。
  • string|array ...$var_names: 可変長引数です。文字列または配列で、連想配列のキーとして使用する追加の変数名を指定します。

戻り値(return)

array

与えられた変数名と値をキー、値を要素とする連想配列を返します。

サンプルコード

PHP compact関数を使わない連想配列作成

<?php

/**
 * compact関数を使わずに、変数から連想配列を作成するサンプルコード。
 *
 * compact関数は文字列で変数名を指定するため、リファクタリング時に変数名が変更されても
 * IDEが追従しにくく、エラーの原因になる可能性があります。
 * そのため、明示的に連想配列を定義する方が、可読性と保守性の観点から推奨される場合があります。
 */

$userName = "山田 太郎";
$userAge = 28;
$userCity = "東京都";
$userOccupation = "エンジニア";

// compact関数を使わず、明示的に連想配列を定義する
// キーと値の対応が明確になり、IDEの補完も効きやすくなります。
$userInfo = [
    'name' => $userName,
    'age' => $userAge,
    'city' => $userCity,
    'occupation' => $userOccupation,
];

// 作成された配列の内容を出力して確認
echo "--- compact関数を使わない連想配列の作成 ---" . PHP_EOL;
print_r($userInfo);

/*
// 参考:もしcompact関数を使う場合
// compact('userName', 'userAge', 'userCity', 'userOccupation') と記述することになります。
// 文字列で指定するため、変数名の変更があった際に文字列も忘れずに変更する必要があり、
// IDEによるリファクタリング支援が効きません。
$userInfoCompact = compact('userName', 'userAge', 'userCity', 'userOccupation');
echo PHP_EOL . "--- compact関数を使った連想配列の作成 (参考) ---" . PHP_EOL;
print_r($userInfoCompact);
*/

?>

PHPのcompact関数は、複数の変数から、変数名をキーとし、その変数の値を値とする連想配列を簡単に作成するための機能です。引数には、連想配列のキーにしたい変数名を文字列、または文字列の配列として一つ以上指定します。戻り値は作成された連想配列です。

しかし、この関数は、変数名を文字列として渡すため、コードのリファクタリング、例えば変数名の変更を行った際に、開発環境(IDE)の自動追従が効きません。これにより、コードの保守性が低下し、意図しないエラーが発生するリスクがあります。

そのため、提示されたサンプルコードではcompact関数を使用せず、明示的に連想配列を定義する方法が示されています。具体的には、$userInfo = ['name' => $userName, 'age' => $userAge, ...]; のように、直接キーと値を指定して配列を作成しています。この方法を用いることで、どの変数がどのキーに対応するのかが明確になり、コードの可読性が大幅に向上します。また、変数名が変更された場合でもIDEがその変更を追従しやすくなるため、エラーを未然に防ぎ、長期的なコードの保守性を高めることができます。

このように、compact関数は手軽に連想配列を作成できる一方で、保守性の観点から明示的な定義が推奨される場面が多いことを理解しておきましょう。

compact関数は、変数名を文字列で指定するため、後から変数名を変更した場合にIDEが追従できず、エラーの原因になりやすい点に注意が必要です。また、どの変数がどのキーに対応するのか、コードを見ただけでは理解しにくい場合があります。

サンプルコードのように['キー' => $変数名]と明示的に連想配列を定義する方法は、キーと値の対応が明確になり、コードの可読性が向上します。さらに、IDEの自動補完やリファクタリング機能が正しく動作するため、保守性が高く、予期せぬバグの発生を防ぐことにつながります。安全で堅牢なコードを書くためにも、この記述方法を推奨いたします。

【PHP8.x】compact関数の使い方 | いっしー@Webエンジニア