return 文
関数の処理を終了して呼び出し元に値を返すには『return』文を使います。『PHP』では配列を使って複数の値を一度に返したり、早期returnでガード節を書いたり、戻り値型宣言で意図を明示したりできます。
構文
// 値を返す
function 関数名(): 戻り値型 {
return 値;
}
// 値を返さない(void)
function 関数名(): void {
// return; のみ、または省略できます
return;
}
// null を許容する戻り値型(?型名)
function 関数名(): ?型名 {
return null; // または 型名 の値
}
// 複数の値を配列で返す
function 関数名(): array {
return [値1, 値2, 値3];
}
return文の基本
| 構文・記述 | 概要 |
|---|---|
| return 値; | 関数の処理をその場で終了し、指定した値を呼び出し元に返します。 |
| return; | 値を返さずに関数を終了します。戻り値型が『void』の関数で使用します。 |
| (returnを省略) | 関数の末尾まで処理が進んだ場合、暗黙的に『null』が返ります。戻り値型を宣言している場合は省略しないほうが明確です。 |
| return [値1, 値2]; | 複数の値を配列にまとめて返します。呼び出し元で分割代入(list() または [])を使って受け取れます。 |
| 早期return(ガード節) | 条件が満たされない場合に関数の冒頭で即座にreturnし、それ以降の処理のネストを浅くする書き方です。 |
戻り値型の宣言
| 戻り値型 | 概要 |
|---|---|
| int / float / string / bool | スカラー型(整数・浮動小数点数・文字列・真偽値)を返すことを宣言します。 |
| array | 配列を返すことを宣言します。複数の値をまとめて返す場合に使用します。 |
| void | 値を返さないことを宣言します。戻り値が不要な処理(出力・副作用のみの関数)に使用します。return; のみ書くか、returnを省略します。 |
| ?型名 | null 許容型です。指定した型または null を返せます。例:『?string』は文字列または null を返します。 |
| mixed | 任意の型を返すことを表します。型を限定しない場合に使用します。 |
サンプルコード
return_basic.php
<?php
// return文の基本です
// ドラゴンボールのキャラクターの戦闘力を計算して返します
function calcPower(string $name, int $basePower, float $multiplier): float {
// 計算結果を呼び出し元に返します
return $basePower * $multiplier;
}
$kakarotPower = calcPower("カカロット", 9000, 1.0);
echo "カカロットの戦闘力: " . $kakarotPower . "\n";
$ssGokuPower = calcPower("孫悟空(超サイヤ人)", 9000, 50.0);
echo "超サイヤ人孫悟空の戦闘力: " . $ssGokuPower . "\n";
実行すると次のように出力されます。
php return_basic.php カカロットの戦闘力: 9000 超サイヤ人孫悟空の戦闘力: 450000
return_multiple.php
<?php
// 複数の値を配列にまとめて返す例です
// ドラゴンボールのキャラクター情報を配列で返し、呼び出し元で分割代入します
function getCharacterInfo(string $name): array {
// 名前・種族・戦闘力を配列にまとめて返します
$data = [
"孫悟空" => ["サイヤ人", 9000],
"ベジータ" => ["サイヤ人", 8000],
"ピッコロ" => ["ナメック星人", 3500],
];
if (isset($data[$name])) {
// [$種族, $戦闘力] の形で返します
return $data[$name];
}
// 見つからない場合は不明値の配列を返します
return ["不明", 0];
}
// list() で分割代入して受け取ります
list($race, $power) = getCharacterInfo("孫悟空");
echo "孫悟空: 種族={$race}, 戦闘力={$power}\n";
// PHP 7.1以降では [] でも分割代入できます
[$race, $power] = getCharacterInfo("ベジータ");
echo "ベジータ: 種族={$race}, 戦闘力={$power}\n";
[$race, $power] = getCharacterInfo("フリーザ");
echo "フリーザ: 種族={$race}, 戦闘力={$power}\n";
実行すると次のように出力されます。
php return_multiple.php 孫悟空: 種族=サイヤ人, 戦闘力=9000 ベジータ: 種族=サイヤ人, 戦闘力=8000 フリーザ: 種族=不明, 戦闘力=0
return_guard.php
<?php
// 早期returnによるガード節の例です
// 条件を満たさない場合に関数の冒頭でreturnし、処理のネストを浅くします
// ドラゴンボールの修行許可チェックを例にします
// ガード節なし(ネストが深くなりやすい書き方)
function checkTrainingBad(string $name, int $power, bool $hasRecommendation): string {
if ($power >= 1000) {
if ($hasRecommendation) {
return $name . ": 修行許可";
} else {
return $name . ": 推薦状が必要です";
}
} else {
return $name . ": 戦闘力が足りません(必要: 1000以上)";
}
}
// ガード節あり(早期returnでネストを浅くした書き方)
function checkTrainingGood(string $name, int $power, bool $hasRecommendation): string {
// 戦闘力が不足していればすぐに返します
if ($power < 1000) {
return $name . ": 戦闘力が足りません(必要: 1000以上)";
}
// 推薦状がなければすぐに返します
if (!$hasRecommendation) {
return $name . ": 推薦状が必要です";
}
// すべての条件を満たした場合のみここに到達します
return $name . ": 修行許可";
}
echo checkTrainingGood("孫悟飯", 2800, true) . "\n";
echo checkTrainingGood("ヤムチャ", 177, false) . "\n";
echo checkTrainingGood("天津飯", 1830, false) . "\n";
実行すると次のように出力されます。
php return_guard.php 孫悟飯: 修行許可 ヤムチャ: 戦闘力が足りません(必要: 1000以上) 天津飯: 推薦状が必要です
return_void.php
<?php
// void 戻り値型の例です
// 値を返さない関数に void を宣言することで意図を明示します
// 出力のみ行い、値を返さない関数です
function printStatus(string $name, int $power): void {
echo $name . " の戦闘力: " . $power . "\n";
// void 宣言がある場合、return; のみ書くか省略できます
// return 値; と書くとエラーになります
}
printStatus("孫悟空", 9000);
printStatus("クリリン", 206);
printStatus("ナッパ", 4000);
実行すると次のように出力されます。
php return_void.php 孫悟空 の戦闘力: 9000 クリリン の戦闘力: 206 ナッパ の戦闘力: 4000
return_nullable.php
<?php
// nullable な戻り値型(?型名)の例です
// キャラクターが見つかれば文字列を、見つからなければ null を返します
function findCharacter(string $name): ?string {
$characters = ["孫悟空", "ベジータ", "ピッコロ", "クリリン", "孫悟飯"];
foreach ($characters as $character) {
if ($character === $name) {
// 見つかった場合は文字列を返します
return $name . " はキャラクター一覧に存在します。";
}
}
// 見つからない場合は null を返します
return null;
}
$result = findCharacter("ベジータ");
// null チェックをしてから使用します
if ($result !== null) {
echo $result . "\n";
} else {
echo "キャラクターが見つかりませんでした。\n";
}
$result = findCharacter("フリーザ");
if ($result !== null) {
echo $result . "\n";
} else {
echo "フリーザ はキャラクター一覧に存在しません。\n";
}
// null 合体演算子(??)で簡潔に書くこともできます
$message = findCharacter("クリリン") ?? "キャラクターが見つかりませんでした。";
echo $message . "\n";
実行すると次のように出力されます。
php return_nullable.php ベジータ はキャラクター一覧に存在します。 フリーザ はキャラクター一覧に存在しません。 クリリン はキャラクター一覧に存在します。
よくあるミス
よくあるミス1: void関数にreturn値を書いてしまう
戻り値型に『void』を宣言した関数で『return 値;』を書くと致命的エラーになります。『void』関数では『return;』のみ使用するか、returnを省略します。
ng_void_return.php
<?php
// void宣言がある関数でreturn値を書くとエラーになります
function printPower(string $name, int $power): void {
echo $name . " の戦闘力: " . $power . "\n";
return $power; // voidなのに値を返そうとしています
}
printPower("孫悟空", 9000);
実行すると次のように出力されます。
php ng_void_return.php Fatal error: A void function must not return a value
ok_void_return.php
<?php
// void関数ではreturn;のみ書くか、省略します
function printPower(string $name, int $power): void {
echo $name . " の戦闘力: " . $power . "\n";
// return; のみ書くか、省略できます
}
printPower("孫悟空", 9000);
実行すると次のように出力されます。
php ok_void_return.php 孫悟空 の戦闘力: 9000
よくあるミス2: returnを書き忘れてnullが返る
戻り値型を宣言していない関数でreturnを書き忘れると、関数はnullを返します。呼び出し元でその戻り値を使おうとすると予期しない結果になります。
ng_missing_return.php
<?php
// returnを書き忘れています
function getPower(string $name): int {
$powers = ["孫悟空" => 9000, "ベジータ" => 8000];
if (isset($powers[$name])) {
$power = $powers[$name];
// returnを書き忘れています
}
// どの条件でもreturnがないためnullが返ります(型宣言があるとエラーになります)
}
$power = getPower("孫悟空");
echo "戦闘力: " . $power . "\n";
実行すると次のように出力されます。
php ng_missing_return.php Fatal error: Uncaught TypeError: getPower(): Return value must be of type int, none returned
ok_missing_return.php
<?php
// 全ての処理ルートでreturnが実行される実装にします
function getPower(string $name): int {
$powers = ["孫悟空" => 9000, "ベジータ" => 8000];
if (isset($powers[$name])) {
return $powers[$name];
}
return 0; // 見つからない場合のデフォルト値を返します
}
$power = getPower("孫悟空");
echo "戦闘力: " . $power . "\n";
$power2 = getPower("ヤムチャ");
echo "ヤムチャの戦闘力: " . $power2 . "\n";
実行すると次のように出力されます。
php ok_missing_return.php 戦闘力: 9000 ヤムチャの戦闘力: 0
よくあるミス3: 型宣言と実際のreturn値の型不一致(TypeError)
戻り値型を宣言した関数で、宣言と異なる型の値を返すと『TypeError』が発生します。厳格モード(strict_types=1)でなくても型が互換性のない場合はエラーになります。
ng_type_mismatch.php
<?php
declare(strict_types=1);
// 戻り値型をintと宣言していますが、文字列を返しています
function getPowerLevel(string $name): int {
$powers = ["孫悟空" => 9000, "ヤムチャ" => 177];
// 見つからない場合に文字列を返してしまっています
return $powers[$name] ?? "不明";
}
echo getPowerLevel("フリーザ") . "\n";
実行すると次のように出力されます。
php ng_type_mismatch.php Fatal error: Uncaught TypeError: getPowerLevel(): Return value must be of type int, string returned
ok_type_mismatch.php
<?php
declare(strict_types=1);
// nullも返せるようにしたい場合は?intと宣言します
function getPowerLevel(string $name): ?int {
$powers = ["孫悟空" => 9000, "ヤムチャ" => 177];
return $powers[$name] ?? null;
}
$level = getPowerLevel("フリーザ");
if ($level !== null) {
echo "戦闘力: " . $level . "\n";
} else {
echo "データが見つかりませんでした\n";
}
実行すると次のように出力されます。
php ok_type_mismatch.php データが見つかりませんでした
概要
『return』文は関数の処理をその場で終了し、呼び出し元に値を渡す命令です。値を返さない関数には戻り値型に『void』を宣言します。『void』を宣言した関数に値付きの『return 値;』を書くとエラーになります。値を返す必要がある関数では、全ての処理ルートで『return』が実行される実装が安全です。
複数の値を返したい場合は配列にまとめて返すのが基本です。呼び出し元では『list()』または『[]』による分割代入で取り出せます。null を返す可能性がある関数には戻り値型を『?型名』と宣言することで、呼び出し元が null チェックを忘れにくくなります。
早期return(ガード節)は、関数の冒頭で不正な入力や条件不一致を検出してすぐに返す書き方です。ガード節を使うことで、処理の本体が深くネストするのを防げます。関数の定義方法全般については『関数定義(function)』、例外を使ったエラー処理については『try / catch / finally』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。