PHPでは、関数から複数の値を返すことが求められるシチュエーションが多くあります。この記事では、基本的な方法から応用までを解説し、それぞれのメリットとデメリットを確認していきます。
配列を使って複数の値を返す
PHPでは、配列を使用して複数の値を返すことが一般的です。
配列を使う方法のメリットは、シンプルで理解しやすい点です。ただし、配列の要素数が多くなるとコードの可読性が低下する可能性があります。
こちらはPHPの公式の例2にも記載されています。
function small_numbers() {
return [0, 1, 2];
}
// 配列を展開させると、配列のそれぞれのメンバが個別に得られます。PHP 7.1.0以降
[$zero, $one, $two] = small_numbers();
// PHP 7.1.0 より前のバージョンではlistを使うしかありません
list($zero, $one, $two) = small_numbers();
PHP連想配列を使う方法
複数の値に名前を付けて管理したい場合には、連想配列を使うと良いです。
連想配列は、各要素に名前を付けることで、可読性を向上させることができます。一方、配列の使い方に慣れていない場合は、コードがやや複雑に感じられることもあります。
値が文字列の場合はcompact()やextract()を使って、少し簡潔に書くこともできるかと思います。
function small_numbers()
{
return ['zero' => 0, 'one' => 1, 'two' => 2];
}
$small_numbers = small_numbers();
$zero = $small_numbers['zero'];
$one = $small_numbers['one'];
$two = $small_numbers['two'];
PHPインスタンスを使う方法
オブジェクト指向のPHPでは、クラスのインスタンスを使って複数の値を返すことができます。
これは、データとその操作を1つの単位にまとめる際に便利です。
クラスを使うことで、より高度なデータ管理が可能になりますが、シンプルな値の返却にはオーバーヘッドが大きくなる場合があります。
class SmallNumbers()
{
public $zero;
public $one;
public $two;
}
function small_numbers()
{
$out = new SmallNumbers();
$out->zero = 0;
$out->one = 1;
$out->two = 2;
return $out;
}
$small_numbers = small_numbers();
$zero = $small_numbers->zero;
$one = $small_numbers->one;
$two = $small_numbers->two;
PHPまとめ
そもそも複数の戻り値が返るような設計は間違っていると思うのですが、やむをえない場合は上記から色々試してみてください。
上記の他にもyieldを使ったり参照渡しを使ったりするなど、いくつか方法があるのですが、難しかったり、見通しが悪くなったりするので、割愛しています。
必要になった際に、色々な実装方法があるとだけ覚えていれば、実装時やレビュー時に役に立つと思います。
コメント