メソッドと戻り値

目次
  • 解説
  • 1. 学習の準備
  • 2. 最も単純なメソッド
  • 3. メソッドの呼び出し
  • 4. 戻り値のあるメソッド
進捗を変更する




解説

1. 学習の準備


下表のとおり学習用のクラスを作成して、その中にmainメソッドを作っておきましょう。

ファイル名Structure.php
クラス名Structure

これまでは「php_basic」プロジェクトに直接PHPファイルを作成してきましたが、ここからはプロジェクト直下に「structure」フォルダーを作成し、そのフォルダー中にファイルを作成しましょう。フォルダー構成が変わるので、include文は以下のようにしてください。

include '../utility/Logger.php';

2. 最も単純なメソッド


メソッドについて「基礎知識 > PHPファイル内の構造 > メソッド(概要)」で概要を学習し、それ以降たくさん作成して使用してきましたが、改めてメソッドの構造と使い方を詳しく学習していきましょう。

ではまず、これまで通りメソッドを作成して動かしてみましょう。
ブラウザから「http://localhost/php_basic/structure/Structure.php」を確認してください。

    static function practiceSimpleMethod() {
        Logger::echo('メソッド');
    }

これをmainメソッドから呼び出すとブラウザに「メソッド」と出力しますが、mainメソッド側には何も影響を及ぼしません。また、2行目の処理をそのままmainメソッドに書いても全く同じ結果となります。つまり、このメソッドは処理をブロックの中に移動して名前を付けただけ、ということになります。

この仕組みはとても単純ですが、たくさんの処理を用途や目的ごとにブロックとしてまとめ、名前を付けて整理することが可能です。また、たった1行の呼び出し部分を書くだけで、そのたくさんの処理を何度も実行させることができるなど、プログラムを効率的に書くためにはなくてはならない仕組みです。

3. メソッドの呼び出し


最も単純なメソッドはmainメソッドから呼び出していましたが、その中でLogger::echoメソッドを呼び出していたように、mainメソッド以外からもメソッドを呼び出すことが可能です。

メソッドがメソッドを呼び出すときのプログラム全体の流れを見てみましょう。

    static function practiceSimpleMethod() {
        Logger::echo('practiceSimpleMethod 開始');
        self::practiceNestedMethod_1();
        Logger::echo('practiceSimpleMethod 終了');
    }

    static function practiceNestedMethod_1() {
        Logger::echo('practiceNestedMethod_1 開始');
        self::practiceNestedMethod_1_1();
        self::practiceNestedMethod_1_2();
        Logger::echo('practiceNestedMethod_1 終了');
    }

    static function practiceNestedMethod_1_1() {
        Logger::echo('practiceNestedMethod_1_1 開始');
        Logger::echo('practiceNestedMethod_1_1 終了');
    }

    static function practiceNestedMethod_1_2() {
        Logger::echo('practiceNestedMethod_1_2 開始');
        Logger::echo('practiceNestedMethod_1_2 終了');
    }
[2020/12/31 12:34:56] practiceSimpleMethod 開始
[2020/12/31 12:34:56] practiceNestedMethod_1 開始  
[2020/12/31 12:34:56] practiceNestedMethod_1_1 開始
[2020/12/31 12:34:56] practiceNestedMethod_1_1 終了
[2020/12/31 12:34:56] practiceNestedMethod_1_2 開始
[2020/12/31 12:34:56] practiceNestedMethod_1_2 終了
[2020/12/31 12:34:56] practiceNestedMethod_1 終了
[2020/12/31 12:34:56] practiceSimpleMethod 終了

メソッドAがメソッドBを呼び出す際、その時点でメソッドAは一旦中断します。そしてメソッドBに処理が移り、メソッドBのすべての処理が終了すると、メソッドAの処理が再開される、という流れが見て取れるでしょうか。

流れがわからない場合は、次の行番号の順にプログラムを追いかけてみましょう。
1 > 2 > 3 > 7 > 8 > 9 > 14 > 15 > 16 > 17 > 10 > 19 > 20 > 21 > 22 > 11 > 12 > 4 > 5

4. 戻り値のあるメソッド


最も単純なメソッドでは、呼び出し側に何も影響を及ぼしませんでした。今度は、メソッド内の処理の結果を呼び出し側に戻す戻り値のあるメソッドを作ってみましょう。

    static function practiceReturn() {
        $stringResult = self::practiceStringResult();
        Logger::echo($stringResult);
        $intResult = self::practiceIntResult();
        Logger::echo($intResult);
    }

    static function practiceStringResult() {
        return '戻り値';
    }

    static function practiceIntResult() {
        return 100 + 20 + 3;
    }
[2020/12/31 12:34:56] 戻り値
[2020/12/31 12:34:56] 123

practiceMethodから呼び出す、戻り値のあるメソッドを3つ追加しました。

まず注目したいのは、「practiceStringResult()」のようなメソッド呼び出しが、代入式の右辺に書かれていることです。この状態で実行されると、そのメソッド内の「return」に続く値が、呼び出し側の左辺の変数に代入されることになります。このreturn文により呼び出し側へ戻す値は、代入と同様に式の結果やメソッドの呼び出しにすることが可能です。