プログラムのブラッシュアップ(関数について)
前回作成したcart.php
は、処理が非常に長く複雑になりました。ここで少しブラッシュアップし、読みやすいものにしたいと思います。まずは、長い処理を見やすくするためのテクニックとして、「関数」を紹介します。関数の使い方を覚えることで、長い処理を細かな機能の単位に分割し、より読みやすいプログラムを記述できます。
まず、関数を使わずに記述したプログラムの例を見てみましょう。
// seibetu が 0 の場合は女性、1 の場合は男性を表すものとする。 $simei_1 = "翔泳 花子"; $seibetu_1 = 0; if( $seibetu_1 == 0 ) { $keisyou_1 = $simei_1 . "さん"; } else { $keisyou_1 = $simei_1 . "君"; } print( "ようこそ!" . $keisyou_1 ); // ようこそ!翔泳花子さん $simei_2 = "光度 仁"; $seibetu_2 = 1; if( $seibetu_2 == 0 ) { $keisyou_2 = $simei_2 . "さん"; } else { $keisyou_2 = $simei_2 . "君"; } print( "ようこそ!" . $keisyou_2 ); // ようこそ!光度 仁君
これは「ようこそ」メッセージを画面に表示するプログラムです。男女別に「君」と「さん」の敬称を付け、1回目は、「ようこそ!翔泳花子さん」を、2回目は「ようこそ!光度 仁君」を表示します。上記のような記述では、同じ処理を行えば行うほどif
文が増えて読み辛いものとなります。
そこで、関数を使って書き換えてみます。以下がその例です。
/** * 敬称を付加する関数 */ function add_suffix( $name, $gender ) { if( $gender == 0 ) { $name = $name . "さん"; } else { $name = $name . "君"; } return $name; } // seibetu が 0 の場合は女性、1 の場合は男性を表すものとする。 $simei_1 = "翔泳 花子"; $seibetu_1 = 0; $keisyou_1 = add_suffix( $simei_1, $seibetu_1 ); print( "ようこそ!" . $keisyou_1 ); // ようこそ!翔泳花子さん $simei_2 = "光度 仁"; $seibetu_2 = 1; $keisyou_2 = add_suffix( $simei_2, $seibetu_2 ); print( "ようこそ!" . $keisyou_2 ); // ようこそ!光度 仁君
2つあったif
文が、1つになっていることに気付いたでしょうか? 関数とはこのように、長いプログラムの中でよく使いそうな機能に目を付けて、機能名を付けて読みやすいものにするための手法と考えてください。関数を使うことで、次のようなメリットがあります。
- 特定の機能に名前(関数名)を付けることができるため、プログラムが理解しやすくなる
- 同じ処理を2度も3度も書く必要がなくなる
- 処理に変更があった場合、関数の中だけを変更すれば済むようになる
1と2に関しては、前述のとおりです。3に関しては、例えば消費税の計算を関数で行わせた場合をイメージしてください。関数の中で消費税5%を加算する処理を行うようにしておけば、仮に消費税が10%になった場合でも、2箇所、3箇所と修正する必要がなくなります。
関数は、以下の書式で記述します。
function 関数名( 引数1, 引数2 … ) { 処理1 処理2 return 戻り値 }
先程のサンプルプログラムと見比べてください。ここでいくつかの新たな用語が出てきたので説明しておきます。
関数名
関数につける名前のこと。例ではadd_suffix
が関数名となる。
引数(ひきすう)
関数に渡す変数のこと。例では$name
と$gender
が引数となる。引数は無くてもよい。
戻り値
関数が、関数の呼び出し元に返す値のこと。例では「君」または「さん」を付加した$name
が戻り値となる。戻り値は無くてもよい。
ここで注意すべきは引数です。関数内では、前述の例の$simei_1
や$seibetu_1
といった、関数外の変数を見ることは基本的にはできません。例えばadd_suffix
関数内で、
print($simei_1);
と記述しても、何も表示されないということです。これらの変数は、関数に引数として引き渡すことで初めて、関数内で使用可能となります。関数に引数として渡された$simei_1
と$seibetu_1
は、関数内では、$name
、$gender
という別の変数名が付けられます。
$_SESSION
や$_REQUEST
に関しては、引数として渡さなくても関数内で使用可能です。
また、関数は呼び出されるまでは実行されません。上記の例では、次の2カ所が関数を呼び出している部分です。
$keisyou_1 = add_suffix( $simei_1, $seibetu_1 );
$keisyou_2 = add_suffix( $simei_2, $seibetu_2 );
これらの関数を呼び出している部分がなければ、関数を定義しても関数内に記述した処理は何も実行されないことに注意してください。
関数の結果として返される戻り値は、=
(イコール)記号で変数に代入することができ、それぞれ$keisyou_1
と$keisyou_2
という変数に代入されています。