【PHP】戻り値(return) - 関数の処理結果を値で返す

【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が実行される状況を制限しましょう。

演習問題

問題1

月から季節を出力するプログラムを作成してください。
なお、下記条件を満たすものとします。

  • 月はコマンドライン引数で与える
  • 月と季節の対応は表の通りとする
  • 季節の判別を行う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
入力が正しくありません。

問題2

閏年判定プログラムを作成してください。
なお、下記条件を満たすものとします。

  • 年はコマンドライン引数で与える
  • 閏年判定のアルゴリズムはグレゴリオ暦に従う
  • 閏年判定を行う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年 : 閏年

問題3

年の日数を出力するプログラムを作成してください。
なお、下記条件を満たすものとします。

  • 年はコマンドライン引数で与える
  • 閏年判定のアルゴリズムはグレゴリオ暦に従う
  • 年の日数を求める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日

問題4

月の末日を出力するプログラムを作成してください。
なお、下記条件を満たすものとします。

  • 年と月はコマンドライン引数で与える
  • 閏年判定のアルゴリズムはグレゴリオ暦に従う
  • 末日を求める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日

問題5

日付の曜日を出力するプログラムを作成してください。
なお、下記条件を満たすものとします。

  • 年、月、日はコマンドライン引数で与える
    ※ 年は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

問題6

年間カレンダーを出力するプログラムを作成してください。
なお、下記条件を満たすものとします。

  • 年はコマンドライン引数で与える
    ※ 年は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