PHP レッスン — レッスン 7 — PHP の関数と関数型プログラミング
いよいよ、そろそろ… そろそろプログラミングを始める時が来たと思います。このレッスンの後、あなたは PHP でプログラミングをしたと言えるようになります。他のページ、他の .php ファイルで繰り返されるべきコードを書かなければならないことがよくあります。このコードを重複させないために、PHP には関数があります。
関数は、何らかの計算を行う独立したコードの部分です。そのような関数の例は、前のレッスンで見かけました:
time() - Unix 紀元の開始からの秒数を出力する関数。
print()、echo() - html を出力できる関数。
floor() - 小数から整数部分を返す関数。
おそらく、関数が 2 つの括弧 () で表されることに気づいたでしょう。関数の一般的な書き方は次のようになります:関数名()。実は、関数の命名規則は変数の命名規則と同じです。ただ、変数にはドル記号を書きますが、関数にはドル記号を使わず、括弧を使います。
関数が何で構成されているか、例で見てみましょう:
<?php
function plus_one($x){ // 関数の定義
$x = $x + 1; // 関数の本体
return $x; // 返される値
}
$y = 1;
$y = plus_one($y); // 関数の呼び出し
print $y;
?>
関数名から、変数に 1 を足すことはもう分かります。では、関数が何で構成されているか:
関数名
関数名は変数名と同じように付けます:
- 関数名は文字またはアンダースコア「_」で始まらなければならない
- 関数名には英数字とアンダースコア(А-Я、A-Z、0-9、_)のみを含められる
- 関数名にはスペースを含めてはならない。関数名が 2 語以上の場合、アンダースコアで区切る my_function()、または大文字で区切る myFunction() べきである。
新しい関数を定義するには、function という語を使います。この語は、次に関数名が来ることを示します。
関数の本体
これは関数が実行するコードです。私たちの場合、この部分です:
function plus_one($x){
$x = $x + 1; // 関数の本体
return $x; // 関数の本体
}
関数の本体は波括弧 {} で包みます。
返される値
すでに「値を返す」「返される値」と書いてきましたが、それが何を意味するか説明する時です。return という語の後に来る値が、返される値です。この返される値は、関数のコードの実行結果です。私たちの例では、変数 $x の値を返しています。
関数のパラメーター
関数のパラメーターは、関数名の後の丸括弧の中に書く変数や値です。私たちの例では 1 つのパラメーター $x を渡していますが、カンマで区切って複数のパラメーターを渡すこともできます:
<?php
function myFunction($x1, $x2, $x3){
}
$y = myFunction($z, 34, 'こんにちは、世界!');
?>
関数の定義でパラメーターに変数が書かれている場合、それは関数の使用時に指定すべきパラメーターの必要な数だけを示します。パラメーターの数が一致しないと、エラーが発生します:
<?php
function myFunction($x1, $x2, $x3){
}
$y = myFunction(34, 'こんにちは、世界!'); // 誤った関数の呼び出しはエラーを引き起こす!!!
?>
また、定義ではローカルで使われる変数名を指定しますが、関数の呼び出し時にはパラメーターを通じて任意の値や変数を設定できることに注目してください。
洒落で申し訳ありませんが、簡単な数学の関数の例で PHP 関数がどう動作するか見てみましょう。関数 y=-2x+4 があるとして、引数 x のさまざまな値での関数の値を求めましょう。
<?php
function myFunction($x){
$y = -2 * $x + 4;
return $y;
}
$z1 = myFunction(1);
$z2 = myFunction(2);
$z3 = myFunction(3);
print $z1 . '<br />' . $z2 . '<br />' . $z3;
?>
結果は -2、0、2 になります。この例の後、関数がどう動作するか分かると思います。
では、関数型プログラミングについてもう少し話しましょう。この種のプログラミングがなぜ関数型と呼ばれるか、もうお察しでしょう。そのとおり、プログラミングの基礎に関数、多くの関数、各ファイルに 10 個ずつの関数があるからです。では、これほどの数の関数をどう扱うのか、と尋ねるでしょう。簡単だと答えます。例で説明します。
<?php
function incr($x){
$x++;
return $x;
}
function decr($y){
$y--;
return $y;
}
$z = 0;
$z = incr($z);
$z = incr($z);
$z = incr($z);
$z = incr($z);
$z = decr($z);
print $z;
?>
上の例で述べたように、私たちは 4 回 1 を増やし、1 回 1 を減らしました。ですから答えは 3 です。では、関数を例そのものより下に移動させましょう。
<?php
$z = 0;
$z = incr($z);
$z = incr($z);
$z = incr($z);
$z = incr($z);
$z = decr($z);
print $z;
function incr($x){
$x++;
return $x;
}
function decr($y){
$y--;
return $y;
}
?>
このコードを実行しても、何も変わらず、やはり 3 になります。それは、PHP が、実行中の現在の演算子に対してどこで定義されていようと関数を見つけるからです。しかしそこで、50 個、100 個、1000 個の関数があったらどうするのか、という疑問が出てきます。答えは単純で、関数を似た機能ごとに分け、整然と、つまりフォルダやファイルに整理することです。2 つのファイルを作りましょう:
decr.php:
<?php
function decr($y){
$y--;
return $y;
}?>
incr.php:
<?php
function incr($x){
$x++;
return $x;
}?>
index.php ファイルの関数の定義は削除すべきです。同じ名前の関数を再定義するとエラーが発生するからです。また、定義なしに関数を呼び出しても、やはりエラーが発生します。ですから注意してください。
あとは、関数のファイルを結合するだけです。index.php ファイルで include 関数を使って結合します:
<?php
include 'incr.php';
include 'decr.php';
$z = 0;
$z = incr($z);
$z = incr($z);
$z = incr($z);
$z = incr($z);
$z = decr($z);
print $z;
?>
これで、index.php ファイルのコードを詰め込みすぎることなく、incr.php と decr.php のコードを使えます。ご覧のとおり、結果は変わらず、やはり 3 です。
これでも PHP の関数型プログラミングの機能のすべてではありません。次のレッスンで、この種のプログラミングをより詳しく学んでいきます。