PHPには便利な関数がたくさん用意されています。
今回お伝えするのはPHPに元々ある関数ではなく、独自で作成するものです。
少し難しい内容になりますが、これが出来ればプログラミングの幅が大きく拡大するでしょう。
関数とは
関数とは、一連の処理を定義しておくものです。
例えば round() という関数があります。これは小数を四捨五入して整数にする関数です。
引数に 3.4 のような数値をセットし、round(3.4) のように書くと 3 が返ってきます。
この関数の中では小数第一位の数字を取得し、4以下なら小数点より前の部分をそのまま返して、5以上なら1足して返すような処理が書かれているでしょう。
この赤字の処理を定義しておけば、四捨五入をする場合は round(3.4) のように1行定義するだけで出来てしまいます。
round() はPHPに元々定義されている関数ですが、これを自分で独自に定義することが出来ます。
これをユーザー定義関数と言います。
書き方については次に説明します。
ユーザー定義関数の書き方
処理;
(return 戻り値;)
}
関数は基本的には上記のように書きます。
まず頭に function を書くことで「ここから関数を定義します」ということをプログラムを実行するPHP本体に伝えます。
関数名は好きな名前をアルファベットで定義します。
意味のある名前にすると後から実行するときに探しやすいです。
引数は関数名の後ろの括弧内に第一引数, 第二引数, ・・・のように定義します。
引数は関数の呼び出し元から受け取る値を指定するものです。
具体的な書き方は次に説明します。
そして { } の間に処理を書きます。
四捨五入する関数ならば四捨五入をする処理を定義します。
引数を元に処理を行い、結果をHTMLとして画面に出力したり、DBに登録したり、関数の呼び出し元に返したりします。
関数の呼び出し元に返す値のことを戻り値といい場合は return 戻り値; のように書くことで戻り値を受け取れます。
引数の書き方(値渡しと参照渡し)
引数の渡し方には値渡しと参照渡しがあります。
値渡し
例えば、りんご1個100円で、みかんが1個50円でそれを計算する関数があるとします。
1 2 3 4 5 6 7 8 9 |
<?php $price = getPrice(2, 5); echo $price; function getPrice($apple, $orange) { $price = $apple * 100 + $orange * 50; return $price; } ?> |
引数の $apple と $orange は購入する個数です。
この”個数”が引数になります。
左から順番に第一引数、第二引数・・・となるため、$apple が第一引数で $orange が第二引数になります。
2行目で 2 と 5 を渡していますが、渡しほうも順番通りに書きます。
2がりんごの個数で、5がみかんの個数になります。
引数の初期化
ここで、もしりんごがセールで安くなる場合があったとしましょう。
その場合はPHPでは引数の初期化というものがあります。
一言で説明すると、値を渡してもいいし渡さなくてもいいというものです。
渡さない場合には予めセットされた値が使われます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php $price = getPrice(2, 5, 70); echo "セールで無い場合の合計額 = " . $price; echo "<br />"; $price = getPrice(2, 5); echo "セールの場合の合計額 = " . $price; function getPrice($apple, $orange, $applePrice = 100) { $price = $apple * $applePrice + $orange * 50; return $price; } ?> |
getPrice() の第三引数に $applePrice = 100 を追加し、りんごの値段を引数を使って計算するように修正しました。
これは第三引数に値がセットされなければ 100 とし、セットされた場合はそちらの値を使うというものです。
2行目で実行した結果はりんごの値段を70円で計算しています。
6行目で実行した結果はりんごの値段を初期化した100円で計算しています。
ちなみに、初期化していない引数に対して値を渡さなかったらエラー(例外として処理される)になりますので注意してください。
参照渡し
参照渡しというのは、関数の呼び出し元で設定した引数が変数の場合に、関数内でその変数に対し値を変更した場合は呼び出し元でも変数内の値が変わるというものです。
よく分からないですよね?汗
例えば、りんご1個100円で、みかんが1個50円でそれを計算する関数があり、合計額が300円以上ならみかん1個プレゼントするとします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php $apple = 2; $orange = 5; $price = getPrice($apple, $orange, 70); echo "セールで無い場合の合計額 = " . $price . "<br />"; echo "りんごの個数 = " . $apple . "<br />"; echo "みかんの個数 = " . $orange; function getPrice($apple, &$orange, $applePrice = 100) { $price = $apple * $applePrice + $orange * 50; if ($price >= 300) { $apple++; $orange++; } return $price; } ?> |
関数の第二引数になる $orange の前に & をつけて &$orange と書きます。
これにより関数内で $orange の値を書き換えた場合は関数の呼び出し元でも変数の値が書き変わります。
上のコードではみかんは 3行目で 5 を設定していますが、7行目の echo の結果では 6 になっています。
実験用として $apple も関数内で同様に1個増やしていますが、6行目の echo の結果では 2 のままです。
値渡しは変数内の値だけを渡し、参照渡しは変数自体を参照できるということです。
returnで戻り値を受け取る
上のサンプルコードでも散々合計額を返していたのでなんとなくイメージは出来ているでしょう。
return は関数内で処理した結果を、関数の呼び出し元に返すためのものです。
ただ、return にはもう1つ使い方があります。
それが、関数内の処理の中断です。
例えば、上のサンプルコードに、「りんごを1個も買わなかったらエラー」という条件を追加するとします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php $apple = 0; $orange = 5; $price = getPrice($apple, $orange, 70); echo "セールで無い場合の合計額 = " . $price . "<br />"; echo "りんごの個数 = " . $apple . "<br />"; echo "みかんの個数 = " . $orange; function getPrice($apple, &$orange, $applePrice = 100) { if ($apple <= 0) { return; } $price = $apple * $applePrice + $orange * 50; if ($price >= 300) { $apple++; $orange++; } return $price; } ?> |
なんか例としてはあまりよく無いかもしれません・・・
ようは何も返さなくても return を使うとそれがループ処理中だったとしてもその関数内の処理を全て中断してしまいます。
今回の例ではその後の処理は合計額を計算するだけですが、合計額をDBに購入履歴として登録してしまう場合などにはりんごが0個の場合にはDB登録したくないと思います。
仕様的にエラーになる場合には return で処理を中断させ不要な処理をさせないようにすることが出来るということです。
まとめ
関数は一連の処理を定義するものです。
関数は他のプログラミング言語でもありますが、PHPの場合は値渡しと参照渡しを区別させることが出来ます。
引数を初期化できたり、同じ関数でも引数の数が変わったり融通は利きますがなかなか難しい話だと思います。
でも安心してください。使っていればすぐになれます!笑
サーバーサイドのプログラミングはとにかく難しいですが、一番の勉強方法はとにかくたくさんコードを見たり書いたりすることです。
コメントを残す