ITHACK
~ みんなのIT部門 ~

【PHP】戻り値(return) – 関数で値を返す

関数の処理結果を呼び出し元に返す戻り値と呼ばれる仕組みがあります。

ここでは関数の戻り値について解説します。

なお、関数や引数については次の記事をご覧ください。

  • 戻り値

戻り値とは

戻り値とは関数の処理結果を値として、呼び出し元に返す仕組みです。

基本構文

戻り値がある場合の関数の基本構文は次のようになります。

function 関数名( $引数変数名 ) {
    // 処理1
    // 処理2
    // ・・・・・・
    return 戻り値;
}

return 戻り値;の部分が戻り値の記述です。
return;のみの記述もできますが、その場合はNULLを戻り値として返します。
また、戻り値(return)は1つの関数に対して複数記述することができます。

関数の呼び出しについては、戻り値がない関数と同じです。

サンプルコード

戻り値がある関数のサンプルコードをご覧ください。

<?php

function addition($x, $y) {
    $result = $x + $y;
    return $result;
}

$total = addition(3, 7);

echo $total."\n";

?>
10

5行目のreturn $resultが戻り値の定義です。

addition関数は2つの引数$x$yを受け取り、それらを加算した値を$resultに記憶し、returnで戻り値として返しています。

戻り値は変数に代入することができ、8行目のように変数 = 関数呼び出しと記述します。
サンプルコードでは$totalに戻り値を代入しており、実行結果から$totalに戻り値が記憶されていることが分かります。

戻り値のイメージ

ソースコードを作る時、読む時は戻り値の動きをイメージすると理解しやすくなります。
戻り値のイメージとしては、関数の呼び出しの記述が戻り値に置き換わるイメージです。

例えば先ほどのサンプルコードでは、実行すると8行目のaddition(3, 7)が10に置き換わるイメージです。

<?php

function addition($x, $y) {
    $result = $x + $y;
    return $result;
}

$total = 10; // ← addition(3, 7)が実行されると10に置き換わる。
echo $total;

?>

あくまでもイメージの話ですが、このイメージを掴むことで、複雑なプログラムも読みやすくなります。
※ 未学習の方が多いかと思いますが、メソッドの連結などはこのイメージを持つと読みやすくなります。

注意点

注意点はreturnは1つの関数に複数作ることができますが、returnが実行されるとそれ以降の関数内の処理は実行されないことです。

次のコードをご覧ください。

<?php

function calc( $num1, $num2 ) {
    
    $sum = $num1 + $num2;
    echo $num1.' + '.$num2.' = '.$sum."\n";
    return $sum;
    
    $sub = $num1 - $num2;
    echo $num1.' - '.$num2.' = '.$sub."\n";
    return $sub;
    
    $mul = $num1 * $num2;
    echo $num1.' * '.$num2.' = '.$mul."\n";
    return $mul;
    
    $div = $num1 / $num2;
    echo $num1.' / '.$num2.' = '.$div."\n";
    return $div;
    
}

calc(8, 5);

?>
8 + 5 = 13

calc関数は引数で与えた2つの値の四則演算結果を出力するようなコードに見えますが、関数を呼び出すと7行目のreturnが必ず実行されるため、加算のみの処理で終わってしまいます。

複数returnを作る場合は、returnが実行される条件をif文などで絞りましょう。

演習問題

問題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 

まとめ

戻り値は関数の処理結果を呼び出し元に返す仕組みです。
呼び出し元では戻り値を変数に代入することができるため、処理の結果に応じてプログラムを組みことができるようになります。