【PHP】戻り値(return) - 関数の処理結果を値で返す
関数の処理結果を呼び出し元に返す“戻り値”と呼ぶ仕組みがあります。
戻り値を使うことで、呼び出し元で関数の処理結果を使った処理を行うことが可能です。
ここでは、戻り値について解説します。
検証環境
戻り値
戻り値は“関数の処理結果を呼び出し元に返す仕組み”です。
戻り値を使うには“関数の定義”に戻り値の記述を行います。
戻り値の定義
関数に戻り値を定義します。
基本構文
function 関数名( 仮引数1, 仮引数2 ... ) {
処理
return 戻り値;
}
戻り値は定義はreturn 戻り値
です。
戻り値
の部分に呼び出し元に返す値や変数を記述します。
サンプル
<?php
function addition( $x, $y ) {
$result = $x + $y;
___ih_hl_start
return $result;
___ih_hl_end
}
?>
$ php sample.php
$
5行目のreturn $result
が戻り値の記述です。
この関数は引数$x
と$y
の合計値を記憶する$resutl
の値を戻り値として返します。
戻り値の受け取り
戻り値がある関数は処理の終了後、呼び出し元に戻り値を返します。
基本構文
関数名(実引数1, 実引数2 ...)
戻り値のある関数の呼び出しは、戻り値がない関数と同じで、特別何かを記述する必要はありません。
サンプル
<?php
function addition( $x, $y ) {
$result = $x + $y;
return $result;
}
___ih_hl_start
echo addition(3, 8);
___ih_hl_end
?>
$ php sample.php
11
8行目はaddition
関数の呼び出しです。
addition
関数はreturn $result
によって、$result
の値である11
を戻り値として返します。
呼び出し元では戻り値を受け取りますが、そのイメージは、“関数の呼び出し”の記述が戻り値に置き変わるイメージです。
例えば、このサンプルではaddition(3, 8)
が戻り値である11
に置き変わるイメージです。
そのため、8行目はecho 11;
という処理になり、出力結果のようになります。
また、戻り値は代入演算子を使って変数に記憶することができます。
<?php
function addition( $x, $y ) {
$result = $x + $y;
return $result;
}
___ih_hl_start
$total = addition(3, 8);
___ih_hl_end
echo $total;
?>
$ php sample.php
11
呼び出し元が戻り値に置き変わるイメージを持っていれば、8行目は$total = 11
となるので、ソースコードの理解は容易になります。
複数のreturn
return
は1つの関数に複数記述することができますが、return
を実行すると、関数の処理を終了し、それ以降の処理は実行されません。
<?php
function calc( $x, $y ) {
echo "Addition\n";
$result1 = $x + $y;
___ih_hl_start
return $result1;
___ih_hl_end
echo "Subtraction\n";
$result2 = $x - $y;
___ih_hl_start
return $result2;
___ih_hl_end
}
$result = calc(3, 8);
echo $result;
?>
$ php sample.php
Addition
11
calc
関数に対して、6行目と10行目に2つのreturn
があります。
この関数を呼び出すと、6行目のreturn
が実行されるため、7〜10行目は処理されません。
そのため、複数のreturn
を定義する場合は、if文などの条件分岐でreturn
が実行される状況を制限しましょう。
演習問題
月から季節を出力するプログラムを作成してください。
なお、下記条件を満たすものとします。
- 月はコマンドライン引数で与える
- 月と季節の対応は表の通りとする
- 季節の判別を行うseason関数を作成する
引数:月
戻り値:季節(存在しない月の場合はエラーメッセージ)
月 | 季節 |
---|---|
03月~05月 | 春 |
06月~08月 | 夏 |
09月~11月 | 秋 |
12月~02月 | 冬 |
$ php practice.php 4
春
$ php practice.php 7
夏
$ php practice.php 11
秋
$ php practice.php 12
冬
$ php practice.php 13
入力が正しくありません。
閏年判定プログラムを作成してください。
なお、下記条件を満たすものとします。
- 年はコマンドライン引数で与える
- 閏年判定のアルゴリズムはグレゴリオ暦に従う
- 閏年判定を行うis_leap_year関数を作成する
引数 : 年
戻り値: 閏年の場合はtrue、平年の場合はfalse
$ php practice.php 2022
2022年 : 平年
$ php practice.php 2016
2016年 : 閏年
$ php practice.php 2100
2100年 : 平年
$ php practice.php 2400
2400年 : 閏年
年の日数を出力するプログラムを作成してください。
なお、下記条件を満たすものとします。
- 年はコマンドライン引数で与える
- 閏年判定のアルゴリズムはグレゴリオ暦に従う
- 年の日数を求めるdays_in_year関数を作成する
引数:年
戻り値:年の日数
$ php practice.php 2022
2022年 : 365日
$ php practice.php 2016
2016年 : 366日
$ php practice.php 2100
2100年 : 365日
$ php practice.php 2400
2400年 : 366日
月の末日を出力するプログラムを作成してください。
なお、下記条件を満たすものとします。
- 年と月はコマンドライン引数で与える
- 閏年判定のアルゴリズムはグレゴリオ暦に従う
- 末日を求めるlast_day_of_month関数を作成する
引数:年、月
戻り値:末日
$ php practice.php 2022 1
2022年1月 : 31日
$ php practice.php 2022 2
2022年2月 : 28日
$ php practice.php 2024 2
2024年2月 : 29日
$ php practice.php 2027 9
2027年9月 : 30日
日付の曜日を出力するプログラムを作成してください。
なお、下記条件を満たすものとします。
- 年、月、日はコマンドライン引数で与える
※ 年は1873以上で与えられるものとします(暦の関係上)
※ 1873年1月1日は水曜日(We)です - 閏年判定のアルゴリズムはグレゴリオ暦に従う
- 曜日は英語で出力する
日 → Su
月 → Mo
火 → Tu
水 → We
木 → Th
金 → Fr
土 → Sa - 曜日を求めるday_of_week関数を作成する
引数:年、月、日
戻り値:曜日を示す値
→ 日(0)/ 月(1)/ 火(2)/ 水(3)/ 木(4)/ 金(5)/ 土(6)
$ php practice.php 2022 1 1
2022年1月1日 : Sa
$ php practice.php 2024 2 29
2024年2月29日 : Th
$ php practice.php 2027 7 12
2027年7月12日 : Mo
$ php practice.php 2029 2 28
2029年2月28日 : We
年間カレンダーを出力するプログラムを作成してください。
なお、下記条件を満たすものとします。
- 年はコマンドライン引数で与える
※ 年は1873以上で与えられるものとします(暦の関係上)
※ 1873年1月1日は水曜日(We)です - 閏年判定のアルゴリズムはグレゴリオ暦に従う
- 曜日は英語で出力する
日 → Su
月 → Mo
火 → Tu
水 → We
木 → Th
金 → Fr
土 → Sa - カレンダーを出力するcalendar関数を作成する
引数:年
戻り値:なし
$ php practice.php 1873
====================
======= 1873 =======
====================
-------- 01 --------
Su Mo Tu We Th Fr Sa
01 02 03 04
05 06 07 08 09 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
-------- 02 --------
Su Mo Tu We Th Fr Sa
01
02 03 04 05 06 07 08
09 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
-------- 03 --------
Su Mo Tu We Th Fr Sa
01
02 03 04 05 06 07 08
09 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
-------- 04 --------
Su Mo Tu We Th Fr Sa
01 02 03 04 05
06 07 08 09 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
-------- 05 --------
Su Mo Tu We Th Fr Sa
01 02 03
04 05 06 07 08 09 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
-------- 06 --------
Su Mo Tu We Th Fr Sa
01 02 03 04 05 06 07
08 09 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
-------- 07 --------
Su Mo Tu We Th Fr Sa
01 02 03 04 05
06 07 08 09 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
-------- 08 --------
Su Mo Tu We Th Fr Sa
01 02
03 04 05 06 07 08 09
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
-------- 09 --------
Su Mo Tu We Th Fr Sa
01 02 03 04 05 06
07 08 09 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
-------- 10 --------
Su Mo Tu We Th Fr Sa
01 02 03 04
05 06 07 08 09 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
-------- 11 --------
Su Mo Tu We Th Fr Sa
01
02 03 04 05 06 07 08
09 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
-------- 12 --------
Su Mo Tu We Th Fr Sa
01 02 03 04 05 06
07 08 09 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
$ php practice.php 2000
====================
======= 2000 =======
====================
-------- 01 --------
Su Mo Tu We Th Fr Sa
01
02 03 04 05 06 07 08
09 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
-------- 02 --------
Su Mo Tu We Th Fr Sa
01 02 03 04 05
06 07 08 09 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29
-------- 03 --------
Su Mo Tu We Th Fr Sa
01 02 03 04
05 06 07 08 09 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
-------- 04 --------
Su Mo Tu We Th Fr Sa
01
02 03 04 05 06 07 08
09 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
-------- 05 --------
Su Mo Tu We Th Fr Sa
01 02 03 04 05 06
07 08 09 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
-------- 06 --------
Su Mo Tu We Th Fr Sa
01 02 03
04 05 06 07 08 09 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
-------- 07 --------
Su Mo Tu We Th Fr Sa
01
02 03 04 05 06 07 08
09 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
-------- 08 --------
Su Mo Tu We Th Fr Sa
01 02 03 04 05
06 07 08 09 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
-------- 09 --------
Su Mo Tu We Th Fr Sa
01 02
03 04 05 06 07 08 09
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
-------- 10 --------
Su Mo Tu We Th Fr Sa
01 02 03 04 05 06 07
08 09 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
-------- 11 --------
Su Mo Tu We Th Fr Sa
01 02 03 04
05 06 07 08 09 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
-------- 12 --------
Su Mo Tu We Th Fr Sa
01 02
03 04 05 06 07 08 09
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
$ php practice.php 2022
====================
======= 2022 =======
====================
-------- 01 --------
Su Mo Tu We Th Fr Sa
01
02 03 04 05 06 07 08
09 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
-------- 02 --------
Su Mo Tu We Th Fr Sa
01 02 03 04 05
06 07 08 09 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28
-------- 03 --------
Su Mo Tu We Th Fr Sa
01 02 03 04 05
06 07 08 09 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
-------- 04 --------
Su Mo Tu We Th Fr Sa
01 02
03 04 05 06 07 08 09
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
-------- 05 --------
Su Mo Tu We Th Fr Sa
01 02 03 04 05 06 07
08 09 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
-------- 06 --------
Su Mo Tu We Th Fr Sa
01 02 03 04
05 06 07 08 09 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
-------- 07 --------
Su Mo Tu We Th Fr Sa
01 02
03 04 05 06 07 08 09
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
-------- 08 --------
Su Mo Tu We Th Fr Sa
01 02 03 04 05 06
07 08 09 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
-------- 09 --------
Su Mo Tu We Th Fr Sa
01 02 03
04 05 06 07 08 09 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
-------- 10 --------
Su Mo Tu We Th Fr Sa
01
02 03 04 05 06 07 08
09 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
-------- 11 --------
Su Mo Tu We Th Fr Sa
01 02 03 04 05
06 07 08 09 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
-------- 12 --------
Su Mo Tu We Th Fr Sa
01 02 03
04 05 06 07 08 09 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31