|
|
 |
| >IT技術情報>php>PHP第1回:PHP基礎
|
 |
 |
 |
 |
【 ページ 】 | 1
| 2
| 3
| 4 |
<<前のページへ
|
 |
4.関数
この章では関数に関するお約束事を紹介します。
関数とは、決まった処理をプログラムの別のところに記述しておき、使う際に(関数呼び出しといいます)、パラメータを渡したりすることができます。また、関数から関数内で処理した結果の値を関数の呼び出し元に返すことができます。それを関数の戻り値(返り値)といいます。 |
 |
| ■基本 |
 |
関数の宣言は下記のようにします。
| |
 |
1: function
hoge($arg) {
2: return $arg . "<br>";
3: } |
 |
関数を呼び出すときは、$str = hoge("abc") のような形で呼び出し、左記の例だと、$str に文字列「abc<br>」が代入されます。 |
 |
| ■参照渡し |
 |
PHPでは、関数の引数として、参照渡しがサポートされています。追って説明してきますが、まずは書式を。
| |
 |
1: function foo($arg) {
2: $arg = "FOO FUNC.";
3: }
4
5: function hoge(&$arg) {
6: $arg = "HOGE FUNC.";
7: }
8
9: $val = "This is a pen.";
10: foo($val);
11: echo $val;
12
13: $val2 = "This is a book.";
14: hoge($val2);
15: echo $val2;
|
 |
上記、foo 関数は通常の関数宣言、hoge 関数が参照渡しの宣言です。上記コードの出力結果は、「This is a pen.HOGE FUNC.」となります。
つまり、foo 関数は引数が「値(This is a pen.)」として渡されたのに対し、 hoge関数は引数が格納されている場所の「アドレス」が渡されています(という説明ではピンときませんよね。。。)。
別の言葉でいうと、foo 関数のような通常の呼び出し方では、$val の内容が変更できないのに対し、hoge 関数のような参照渡しの場合は $val2 の内容が変更できてしまうということです。
内部処理としては、foo 関数では、引数で渡された値を格納する用のメモリ領域を確保し、そこに引数の値をコピーします。従って、関数内での $val の値の変更は、この新たに確保した領域の値に対して行われます。対して、参照渡しの hoge
関数では、$val の値の変更は、元の値の変更を意味します。
大量のデータ(数MBとか)を関数の引数として渡したい場合などを除き、参照渡しを使わなくても十分実用的なプログラムが作れると思います。
通常の関数呼び出しでは値がコピーされて関数に渡されています。したがって、メモリの量も倍必要なのです(メモリの内容をコピーするのにかかる時間も無駄ですね。)。参照渡しの場合はアドレス(に相当するもの)が渡されますので、メモリはごく少量ですみます。違い、わかっていただけましたでしょうか?
|
 |
| ■デフォルト値 |
 |
関数呼び出しの際、本来あるべき引数が省略された場合にとる値(デフォルト値)を設定できます。デフォルト値の設定は、関数の宣言の際、下記のように書いてやることで実現できます。
| |
 |
1: function
hoge($arg="NO VALUE!") {
2: echo $arg;
3: }
4: hoge("HOGE!");
5: hoge(); |
 |
上記プログラムは、「HOGE!NO VALUE!」を出力します。
まぁ、使わなくてもよいでしょう。逆に、使いすぎるとプログラムの意味がわかりにくくなる場合があるかもしれません。
ただ、すでにいくつものスクリプト中で使っている関数に引数を追加したい時なんかには有効かもしれません。普通だと、すべての関数呼び出しをしている個所を探し出し、引数を追加してやらなければならないのですが、デフォルト値を用いることによって、修正量が少なくてすみます。
|
 |
| ■スコープ |
 |
まず、下記のコードを見てください。結果はどうなると思いますか?
| |
 |
1:
$a = "abc";
2: function hoge() {
3: echo $a;
4: }
5: hoge(); |
 |
上記、何も出力されません。どうしてでしょうか?原因は、変数・配列の章でも書きましたが、関数内からは、グローバル変数 $a にアクセスできないからです。所望の結果を得るためには、
| |
 |
1:
$a = "abc";
2: function hoge() {
3: global $a;
4: echo $a;
5: }
6: hoge(); |
 |
のように $a がグローバル変数であることを宣言(3行目)してやらねばなりません。(もしくは、echo $GLOBALS["a"]; とする方法もあります。)
ちなみに、下記のプログラムは、「123abc」を出力します。
| |
 |
1: $a = "abc";
2: function hoge() {
3: $a = "123";
4: echo $a;
5: }
6: hoge();
7: echo $a; |
 |
つまり、global 宣言されていない場合、関数内の $a と、グローバル変数 $a は全く別のものなんですね。
|
|
 |
【 目次 】
1.はじめに
2.変数・配列
3.制御構造
4.関数
|
 |
【 関連記事 】
|
|
 |
 |
|
|