備忘録として投稿。
・PHPのlist()は、配列から値を抽出して変数に代入するための便利な機能である。
ただし、古いバージョンのPHPでは、list()による代入ができるのは配列のインデックスのみであり、連想配列に対しては使用できなかった。
例えば、以下のコードをPHP 5.6以下で実行すると、list()は構文エラーを引き起こす。
$person = array('name' => 'John', 'age' => 30);
list('name' => $name, 'age' => $age) = $person;
・一方、PHP 7以降では、list()が連想配列に対しても使用できるようになった。
したがって、上記のコードはPHP 7以降で正常に動作する。
・また、PHP 7.1からは、list()による代入がnull合体演算子(??)と組み合わせて使用できるようになった。
これにより、以下のように変数にデフォルト値を設定できるようになった。
$person = array('name' => 'John');
list('name' => $name, 'age' => $age) = $person ?? ['age' => 18];
この場合、\$personにageキーが含まれていない場合、$ageにはデフォルト値として18が代入される。
◎余談◎
・PHP 7.0より前のバージョンでは、list()で配列から値を取り出す場合、配列の先頭から順に値を割り当てていく。
例えば、以下のコードを実行すると、変数\$aに2→1の順で格納される。
list($a[], $a[]) = [1, 2];
しかし、PHP 7.0からは、list()で配列から値を取り出す場合、配列の最初から順に値を割り当てるように変更された。
つまり、上記のコードを実行すると、変数\$aに1→2の順で格納されるようになる。
・この変更は、複数の値を返す関数から返された配列をlist()で変数に割り当てる場合に、より自然な動作をするようになるために行われたもの。
ただし、これまでのコードとの互換性が失われるため、注意が必要。
※訂正※
・list()は、関数ではなく言語構造。勘違いしてました。
https://www.php.net/manual/ja/function.list.php
・list()は、PHPバージョン7.0を境に格納する順番が変わります。
https://3v4l.org/CpIoV#v7.0.0