第7章 関数を作って使おう

7.1 関数を自分で作って使う

PHPにはプログラミングを補助してくれる便利な関数「組み込み関数」が多数用意されています。これまでの学習でも以下に示す組み込み関数を利用してきました。
var_dump、count、rsort、mt_rand、strlen、empty、is_numeric…
しかし、用意されている関数だけでは、やりたいことは行えないこともあります。そんな時は目的に応じた関数「ユーザー定義関数」を、自身で作成して利用すれば処理が行えるようになります。そんなユーザ定義関数を作ってから使うまでの方法を本章で学習して行きましょう。

7.1.1 ユーザー定義関数を作って使うまでの流れ

ユーザー定義関数を作って使うには、以下の2つの手順を行えばよいだけです。

① 目的に応じた関数を作成する(関数定義)
② 必要な場所で関数を呼び出す(関数コール)

組み込み関数は既に①が終わっている状態であるため、②から行うだけで関数を利用できました。しかし、ユーザー定義関数は自身で関数を作成する必要があります。また、ユーザー定義関数は以下のような場合に作ることが一般的です。

  • 組み込み関数に目的の処理が行えるものがない場合
  • 似たような仕組みの処理を何度も行っている場合
  • 規模が大きくなった処理を分割する場合

自身で関数を作成するのは大変かもしれませんが、1度作成しておけば関数は何度でも呼び出すことができるので、様々な場面で再利用することができるので大変便利になります。

関数を呼び出す場所を呼び出し元、呼び出される関数を呼び出し先と呼ぶこともあります。簡単に例えると呼び出し元が「会社の上司」となり、呼び出し先の関数は「部下」となります。上司は部下に命令して作業を行わせるように、関数も呼び出し元から、呼び出し先の関数をコールすることで処理を行わせることができます。
人は命令しなくても自分で考えて作業をこなすことができますが、プログラムでは命令しない限り処理は行ってくれません。関数を作って使うのは不便と思うかもしれませんが、逆に考えると人間は命令しても作業を行わない可能性がありますが、プログラムは命令した処理を絶対に行ってくれます。


図 7.1.1: 関数の動作は上司と部下の関係に似ている

7.1.2 ユーザー定義関数の作り方と呼び出し方

ユーザー定義関数を作る方法は、以下の書式に従って行います。

書式:関数定義

関数には呼び出し元から情報を渡すことができますが、その情報のことを「引数(ひきすう)」といいます。また、逆に関数から情報を呼び出し元へ返すこともでき、その情報のことを「戻り値(もどりち)」といいます。
関数が処理を行う場合に、何か情報が必要であれば「引数」を設定します。さらに呼び出し元へ処理の結果などの情報を返す場合には「戻り値」の設定を行います。引数と戻り値は必ず設定するものではなく、関数の行う処理に応じて適宜設定する必要があります。

①function

プログラム内で関数を定義する場合に関数名より前に付けます。functionとは「関数」の意味を表します。

②関数名

functionの後ろに1文字以上の半角スペースを空けて、この関数の名前を任意で付けます。関数名は自由に付けることが出来ますが、以下の命名規則に従う必要があります。

  • 半角英数字と_(アンダーバー)が利用できる。但し先頭文字に数値は使えない。
  • 既にPHPが用意している関数の名前は使えない。(echo、printなど)
  • 英字の大文字と小文字は区別されない。
③引数

関数へ渡す情報を受け取る変数を記述します。変数名は任意の名前で任意の数だけ設定できます。複数の引数を設定する場合は変数と変数の間を「,(カンマ)」区切って並べていきます。逆に1つも引数がない場合は、()の中には何も記述する必要はありません。

④関数が行う処理

関数の目的に応じた処理を「{}」で囲まれたブロック内に記述します。関数の中から別の関数を呼び出すこともできます。

⑤戻り値

関数内の処理中に「return文」を書くと、その時点で関数の処理を終了します。関数が呼び出し元へ情報(戻り値)を返したい場合に、returnの後ろに1文字以上の半角スペースを空けて設定します。戻り値が不要な場合はreturn;と記述できます。また関数の処理の最後のreturn文は省略可能になっています。

また、関数は1つでなく定義したい数だけ、いくつでも定義することができます。

書式:関数の呼び出し

関数の呼び出しはとても簡単です、関数定義で付けた関数名と引数設定に応じた情報を設定して呼び出せばいいだけです。戻り値を受け取りたい場合は代入演算子と変数を設定します。

①$変数

関数に戻り値が設定されている場合、代入演算子を使って変数に受け取ることができますが、戻り値が不要な場合には省略することもできます。ただし、基本的に戻り値がある場合は、変数に受け取って利用するのが一般的です。また、戻り値が設定されていない場合には、変数へ受け取る処理は記述しません。

②関数名

関数定義している関数の中で呼び出したい関数名を記述します。関数名は大文字、小文字を区別しませんが、基本は関数定義で付けた名前で呼び出します。

③引数

呼び出す関数に引数を渡す場合は、()内に記述します。但し、呼び出す関数に引数の設定がないと引数が渡せないので注意が必要です。引数が複数ある場合は渡す引数の間を「,(カンマ)」で区切ります。引数がない場合でも「()」だけは必ず記述します。

凡例:関数定義と関数の呼び出し

この凡例の関数は呼び出されたら、画面に「Hello!」と表示を行う目的を持って作成されているため、引数も戻り値も設定されていません。呼び出し元の記述でも「echoHello();」と記述するだけで、この関数を利用できます。
関数のパターンは凡例で示したものと、残り3パターンがあります。

  • 引数なし、戻り値なしの関数(上記凡例のパターン)
  • 引数なし、戻り値ありの関数
  • 引数あり、戻り値なしの関数
  • 引数あり、戻り値ありの関数

上記4パターンのどれになるかは、作成する関数の目的に応じてユーザー自身で選択する必要があります。

では簡単な関数を作って動作させるプログラムを見ていきましょう。

足し算処理を行うユーザ定義関数を用いるプログラム

別画面(送信元)からのPOST送信された入力データを送信先のページで受け取り、そのデータを関数の引数に渡して足し算処理を行います。その足し算結果を戻り値として受け取り、Web画面に表示して確認します。

ソース・フォルダー: myproj_basic/ch07
パッケージ: calcForm1.php
アクセスURL:http://localhost/myproj_basic/ch07/calcForm1.php

calcForm1.php

ソース・フォルダー: myproj_basic/ch07
パッケージ: useFunction1.php
アクセスURL:calcForm1.phpからの画面遷移でアクセスされる

useFunction1.php

解説

今回のプログラムは、calcForm1.phpからの入力データをuseFunction1.phpで受け取り、足し算の処理を行います。その足し算処理をユーザー定義関数を利用して行うことがポイントになります。
実際に関数を定義して利用するuseFunction1.php内の処理について説明を行います。

4~6行目が関数の定義部分になります。このcalc関数は以下のように定義されています。
関数名:calc
引数1:$num1(1つ目の数値)
引数2:$num2(2つ目の数値)
戻り値:$num1+$num2(引数2つの加算結果)
目的:calc関数は引数を2つ受け取り、その2つの引数の値を加算した結果を戻り値として返します。

9、10行目は画面からの入力データを取得して、各変数に代入しています。

13行目が関数の呼び出し部分になります、このcalc関数を呼び出すには引数が2つ必要なため、入力データを格納した変数$num1と$num2を引数として設定しています。また戻り値があるので、その結果を受け取るために代入演算子と変数$resultを設定しています。

22行目では関数での計算結果を画面に表示しています。

実行結果を確認すると「4 + 3 = 7」と正しく処理が行われているのが確認できます。
ここでの重要なポイントとなる、関数の呼び出して動作する流れについて以下の図を見て行きましょう。
実行結果の数値「$num1 = 4 , $num2 = 3」を例にします。

① 2つの引数($num1、$num2)を持つcalc関数を呼び出す。
② calc関数内の処理を行う。
③ calc関数の処理結果(戻り値)を呼び出し元へ返す。
④ calc関数の戻り値を受け取り、変数へ代入する。


図 7.1.2:関数の呼び出しから関数の定義部分の動作の流れ

上記の図を①~④の手順ごとに詳しく説明すると以下のようになります。


図 7.1.3:関数の呼び出しと関数本体の動作イメージ

関数名を記述して関数を呼び出すと、その時点で渡した引数の値が関数本体の同じ並びの変数に代入されます。呼び出し元のcalc関数に設定した変数と、本体側の引数の変数名が同じになっていますが、呼び出し元の変数と関数の引数の変数は完全に違う扱いになるため注意が必要です。その処理内でしか有効でない変数のことを「ローカル変数」と呼びます。


図 7.1.4:呼び出し元変数と関数内の変数は別扱い

今回のcalc関数では関数を使うメリットがないように思えます。ただ2つ入力値の足し算を行うだけなら、わざわざ関数にしなくても行えます。では、足し算だけではなく、引き算、掛け算、割り算、剰余を計算できる関数ならどうでしょうか。そんな関数を用意しておくと、違うプログラムの作成時に利用する機会が出てくるはずです。
ユーザー定義関数を作成する一番のメリットは、再度利用できることと言えます。

7.1.3 関数を定義する位置について

前項のプログラムでは、関数の定義位置を呼び出しよりも上に記述していました。しかし、関数を定義する位置は同じファイル内であれば、呼び出し部分よりも上でも下でもどちらに書いても問題ありません。


図 7.1.5:関数の定義位置

関数をあるプログラム内に定義してしまうと、別のプログラムで再度利用することができません。そんな時には関数だけのファイルを作って利用したいPHPプログラムに取り込む方法が利用できます。
別ファイルに定義した関数を取り込む方法は次の7.2節で紹介します。

では、関数の定義を呼び出し部分よりも下にしたプログラムを見て行きましょう。

関数を呼び出し部分よりも下で定義して利用するプログラム

関数を呼び出し部分よりも下に定義しても、正しく動作することを確認してみましょう。

ソース・フォルダー: myproj_basic/ch07
パッケージ: calcForm2.php
アクセスURL:http://localhost/myproj_basic/ch07/calcForm2.php

calcForm2.php

ソース・フォルダー: myproj_basic/ch07
パッケージ: useFunction2.php
アクセスURL:calcForm2からの画面遷移でアクセスされる

useFunction2.php

解説

今回のプログラムは、前項で学習したプログラムの内容に追加して計算方法を選ぶことで「足し算」か「引き算」が行えるようになっています。また関数の定義位置も、呼び出しの記述よりも下で行っているのがポイントです。

9~12行がセレクトボックスを使って、計算方法(+か-)を選択させている部分になります。セレクトボックスは<option>タグと必ずセットで利用します。選択した<option>タグのvalue値が、<select>のname属性の部品名operatorで送信されてきます。

続いて関数の定義と利用を行っているcalcForm2.phpの説明を行っていきます。

3行目でcalc関数を呼び出しています。今回はスーパーグローバル変数を別の変数に代入はせずに、そのまま引数に設定しています。引数にどんなものを設定しても、関数本体には変数の値が送られることが確認できます。

11行目で関数の戻り値(計算結果)が代入されている、変数$resultを入力データと共に画面に表示しています。

18~24行がcalc関数の定義位置になります。関数の定義は以下のようになっています。
関数名:calc
引数1:$num1(1つ目の数値)
引数2:$num2(2つ目の数値)
引数3:$operstor(計算方法)
戻り値:計算結果(引数2つの加算もしくは減算結果)
目的:calc関数は引数を3つ受け取ります。3番目の引数の計算方法(+か-)で、数値の引数の値を加算した結果か減算した結果を戻り値として返します。

実行結果からも分かりますが前項のプログラムと変わって、関数の定義位置が下になっても関数を呼び出して利用できることが確認できます。同一のファイル内に記述するのであれば、上か下かどちらかに決めて関数定義を記述するようにしましょう。

ポイント
  • 関数は書式に従えば、自身で自由に作成することができる。
  • 関数は引数(0~)と戻り値を任意で設定できる。
  • 関数は定義しただけではなく、呼び出して利用することで内部の処理を実行してくれる。
  • 関数は定義した引数の数に合わせて呼び出す必要がある。
  • 基本的に戻り値は代入演算子を使って変数に受け取るが、受け取りは任意で行える。
  • 関数内の変数と呼び出し元の変数は、同じ名前でも別々の変数として扱われる。
  • 関数の定義位置は呼び出しの記述の上下どちらでも問題ない。

NEXT>> 7.2 別のファイルを取り込む方法(includeとrequire)