タプル
値が組になったもののこと。
タプルの例
先に伸べた通り「値が組になったもの」という意味なのだが、実際の例としては引数が想像しやすいだろう。 code:php
array_pad(array $array, int $length, mixed $value): array
この関数は以下のように呼び出す
code:php
$result = array_pad($a, 10, "");
このとき、array_padという関数は引数としてarray, int, mixedという値の組を要求していると考えられる
対して $a, 10, ""という値の組を渡していると考えることができる
1番めの要素が $array, 2番めの要素が$length、3番めの要素が$valueに対応している
このように、順番と要素数が決まっていて内容の型が固まっている値の組をタプルと呼ぶことができる
関数戻り値のタプル
PHPをはじめとする多くのプログラミング言語では「0個以上の引数をとり、1個の戻り値を返す」という特徴がある。
しかしながら、一回の関数呼び出しから複数の値を返したいという需要は根強くある
例として、自動販売機の在庫を取得する関数を考える
code:php
/**
* 商品名から料金と在庫数を返す
*
* @return array{0:int, 1:int}
*/
function get_drink(string $name): array
{
// 処理を省略
}
この関数からは以下のように値を受け取ることができる
code:php
echo "値段: {$value}円", PHP_EOL;
echo "在庫: {$stock}個", PHP_EOL;
このとき、get_drink()の返す$valueと$stockは引数の順番と同じように意味があると考えることができる
今回の関数では戻り値の$valueと$stockは両方intなので、array shapesに慣れていないとint[]やlist<int>と型付けしてしまうかもしれない
すると関数を呼び出す側で戻り値配列に含まれる個数がわからないため、list構文で安全に受け取ることができない 一方で順番に依存するタプルを使わない方がよいのではないかという考えもできる
code:php
/**
* 商品名から料金と在庫数を返す
*
* @return array{value:int, stock:int}
*/
function get_drink(string $name): array
{
// 処理を省略
}
呼び出し側はこうなる
code:php
$item = get_drink('レッドブル');
echo "値段: {$item'value'}円", PHP_EOL; echo "在庫: {$item'stock'}個", PHP_EOL; またはlist構文で以下のようにすることで個別の変数に分割代入もできる code:php
[
'stock' => $stock,
'value' => $value,
] = get_drink('レッドブル');
echo "値段: {$value}円", PHP_EOL;
echo "在庫: {$stock}個", PHP_EOL;
さらに、実装側はこのように変換することができる
code:php
return compact('value', 'stock');