PHPの基礎文法をおさらいする(制御構文)
PHPの制御構文
手続き型または命令型のプログラミング言語では、各々の式または命令はふつう、上から下へと順番に実行されてゆく。けれども、この場合はこの命令を跳ばしてあの命令に移れとか、この場合はこの命令を繰り返せとか、そういった制御を行いたいときには各種の制御構文を使うことができる。
制御構文の代表的なものがif構文。if(値の真偽を判定){実行文;}
という書式でそれは記される。1行で終わるときは波括弧は不要。if構文はそのオプションとしてひとつのelse文を、またはその間に複数のelseif文を持つことができる。
<?php
echo "1 + 1 = ";
// fgets関数で標準入力をint型にして受け取る
$input = (int)(fgets(STDIN,1024));
// 2に等しいなら
if($input == 2) {
echo '正解です。',PHP_EOL;
}
// 1か3に等しいなら
elseif(($input == 1) or ($input == 3)) {
echo '不正解ですが、惜しいです。',PHP_EOL;
}
// 10以上なら
elseif($input > 10) {
echo '数が大きすぎます。',PHP_EOL;
}
// それら以外なら
else {
echo '不正解です。',PHP_EOL;
}
まず1足す1の答えを入力してもらい、その値をint型に変換して受け取っている。
このスクリプトを実行した例は次のようになる。
$ php sample.php
1 + 1 = 3
不正解ですが、惜しいです。
上の例では、ifとelseifとelseをすべて使っている。各々の実行文が複数あるときには波括弧で囲むことが必須だけれども、単独ならば波括弧は必須でない。しかし読みやすいように波括弧を使うことが奨励されている。
波括弧の代わりにコロン記号を使っても記述できる。その場合、if構文の終点としてendif;
を置く必要がある。しかも、波括弧を使った場合にはelseif
をelse if
のように分かち書きができるが、コロン記号を使って記した場合には分かち書きができない。
<?php
echo "1 + 1 = ";
$input = fgets(STDIN,1024);
if($input == 2):
echo '正解です。',PHP_EOL;
elseif(($input == 1) or ($input == 3)):
echo '不正解ですが、惜しいです。',PHP_EOL;
elseif($input > 10):
echo '数が大きすぎます。',PHP_EOL;
else:
echo '不正解です。',PHP_EOL;
endif;
もうひとつ、代表的な分岐構文としてswitch構文がある。switch(判定する変数名){}
という書式で記され、波括弧によるブロックの中に各々のcaseを記述する。if構文による先ほどのスクリプトはswitch構文を使って次のように表すことができる。
<?php
echo '1 + 1 = ';
// 標準入力をfgets関数で受け取る
$input = fgets(STDIN,1024);
// switch文で分岐
switch ($input) {
// 値が2のとき
case 2:
echo '正解です。',PHP_EOL;
break;
// 値が1か3のとき
case 1:
case 3:
echo '不正解ですが、惜しいです。',PHP_EOL;
break;
// それら以外のとき
default:
// 10より大きいなら
if ($input > 10){
echo '数が大きすぎます。',PHP_EOL;
}
// そうでなければ
else {
echo '不正解です。',PHP_EOL;
}
}
オプションとしてdefault:
を持つことができ、default:
は全てのcase:
に当てはまらなかったときに実行される。switch構文でいちばん注意すべきことは、各々のcaseの末尾にbreak;
が記されていること。switch構文から抜け出すためにそれが必要となる。値と合致したcaseが見つかった時点でそこを抜け出さないと、それ以降のcaseまでもが続けて実行されてしまう。試しに、#でbreak;
をコメントアウトしてみると、そのことが分かる。
switch構文もまた、波括弧ではなくコロン記号を使って記述することができる。その場合、switch構文の終点としてendswitch;
を置く必要がある。
<?php
echo '1 + 1 = ';
$input = fgets(STDIN,1024);
switch ($input):
case 2:
echo '正解です。',PHP_EOL;
break;
case 1:
case 3:
echo '不正解ですが、惜しいです。',PHP_EOL;
break;
default:
if ($input > 10):
echo '数が大きすぎます。',PHP_EOL;
else:
echo '不正解です。',PHP_EOL;
endif;
endswitch;
制御構文でもうひとつ重要なのが繰り返し構文。そのひとつがwhile構文。while(値の真偽判定){実行文;}
という書式でそれは記される。while構文ではまず値の真偽が判定され、それが真なら波括弧で挟まれた実行文が処理され、再び元に戻って値の真偽が判定され、それが真なら波括弧で挟まれた実行文が処理されるということを、値が偽と判定されるまで延々と繰り返す。
<?php
$number = 1;
// $number1が10未満なら
while($number < 10){
// 表示+空白文字
echo $number,' ';
// インクリメント
$number++;
}
// 改行
echo PHP_EOL;
while構文もif構文と同様に波括弧を使う代わりにコロン記号とendwhile;
を使って記すことができる。
<?php
$number = 1;
while($number < 10):
echo $number,' ';
$number++;
endwhile;
echo PHP_EOL;
このスクリプトの実行結果は次のようになる。
$ php sample.php
1 2 3 4 5 6 7 8 9
整数値と空白文字の表示を繰り返すことでベクトル構造のように数をならべて表示できた。
繰り返し制御構文はしばしば入れ子にした構造にしても利用される。
<?php
$number1 = 1;
// $number1が10未満なら
while($number1 < 10){
$number2 = 1;
// $number2が10未満なら
while($number2 < 10){
// 掛け算をして表示+タブ
echo ($number1 * $number2),"\t";
// インクリメント
$number2++;
}
// 改行
echo PHP_EOL;
// インクリメント
$number1++;
}
このスクリプトの実行結果は次のようになるはず。
$ php sample.php
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
入れ子にすることでベクトル構造に整数値をならべる動作を繰り返させて行列構造を表現することができた。掛け算の九九を表現した表になっている。
while構文にはこの他に、値の真偽判定を末尾に置くdo while構文もある。doのところでまず一度実行されてから真偽が判定されて真ならば繰り返すのがdo while構文の特徴。do while構文では全体の末尾に;が必要になることに注意。
<?php
echo '1-10以内の数値を入力してください:';
// 標準入力を実数型にして受け取る
$input = (real)(fgets(STDIN,1024));
// $inputが1から10の間なら
if ($input >= 1 and $input <= 10){
do{
$input = $input + $input;
echo $input,' ';
}
// $inputが500以内ならdoを繰り返す
while($input <= 500);
// 改行
echo PHP_EOL;
}
// 1-10の数値でないなら
else {
echo '数値でないか数値が範囲外です。',PHP_EOL;
}
まず数値入力を促し、そのままでは数値がstring型と認識されてしまうので実数型に変換して受け取り、if構文でその数値の範囲を判定をして範囲内ならdo while構文を実行している。do while構文ではまず入力された値同士を加算してそれを表示し、その加算結果が500以内であるかぎりdo内の処理を繰り返している。ちなみにPHP_EOLは改行コードを表す定数。
このスクリプトを実行した結果は次のようになるはず。
l$ php sample.php
1-10以内の数値を入力してください:2.5
5 10 20 40 80 160 320 640
注意する点として、do while構文では波括弧を使う代わりにコロン記号を使って記すことができないこと。
<?php
echo '1-10以内の数値を入力してください:';
$input = (real)(fgets(STDIN,1024));
if ($input >= 1 and $input <= 10):
do:
$input = $input + $input;
echo $input,' ';
while($input <= 500);
echo PHP_EOL;
else:
echo '数値でないか数値が範囲外です。',PHP_EOL;
endif;
このスクリプトは文法エラー(syntax error)になってしまう。
繰り返し実行する回数が最初から決まっている処理がある場合、そのために利用できる繰り返し構文としてfor構文がある。for構文は、for(回数の初期値;回数の真偽判定;回数の増減){実行文;}
という書式で記される。for構文では、繰り返しに関する制御部とそれによって繰り返し実行される実行部(処理部)とが明らかに分離しているので、読みやすいかもしれない。
<?php
for($i=0; $i<10; $i++){
echo '-';
}
echo PHP_EOL;
このスクリプトではハイフンという記号(-)の標準出力が10回繰り返される。変数$の初期値は0なので、0, 1, 2, 3, 4になるまで5回、波括弧内の処理が繰り返されることをこのスクリプトは意味している。繰り返す回数を入れる変数には慣用的に$iや$jが使われることが多い。このスクリプトの実行結果は次のようになるはず。
l$ php sample.php
----------
配列とオブジェクトを扱うための専用の繰り返し構文にforeach構文がある。foreach構文は配列とオブジェクトの繰り返し処理以外には使うことができない。foreach構文は、foreach(配列名 as $value){実行文;}
という書式で記される。
次のスクリプトは配列の要素になっている値をforeach構文を用いて順番に2乗して標準出力をしている。
<?php
// range関数で1から9までの配列を生成
$array = range(1,9);
// foreach構文で配列の各要素に同じ処理をする
foreach($array as &$value){
// 値を2乗する
$value = $value * $value;
// 表示
echo $value,' ';
}
// 改行
echo PHP_EOL;
実行結果は次のようになるはず。
$ php sample.php
1 4 9 16 25 36 49 64 81
次のスクリプトはforeach構文を使ってHTMLの表を表現している。foreach構文で連想配列を扱う場合の書式はforeach(配列名 as $key => $value){実行文;}
のようになる。$keyに各々のキーが、$valueに各々の値が格納される。
<?php
// HTML文書を変数化
$html_head = <<<EOT
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<title>英語の人称代名詞単数形</title>
</head>
<body>\n
EOT;
$html_foot = <<<EOT
</body>
</html>\n
EOT;
$table_head = "<table>\n<tbody>\n";
$table_foot = "</tbody>\n</table>\n";
// 連想配列を用意
$pronouns = [
'第一人称' => 'I',
'第二人称' => 'you',
'第三人称男性' => 'he',
'第三人称女性' => 'she',
'第三人称中性' => 'it'];
// HTML文書の描画
print $html_head;
print $table_head;
// foreach構文を用いて連想配列をHTMLの表に整形
foreach($pronouns as $key => $value){
print "<tr></tr><th>{$key}</th><td>{$value}</td></tr>\n";
}
print $table_foot;
print $html_foot;
変数にはヒアドキュメントをそのまま格納することができる。ヒアドキュメントは<<<EOTに始まってEOT;によって終わる改行を含んだ文字列。ただしその末尾には改行がないので、ここでは改行コードを指定している。
このスクリプトをコンソール・アプリとしてターミナル・エミュレータ上で実行すると次のようになるはず。
$ php sample.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<title>英語の人称代名詞単数形</title>
</head>
<body>
<table>
<tbody>
<tr></tr><th>第一人称</th><td>I</td></tr>
<tr></tr><th>第二人称</th><td>you</td></tr>
<tr></tr><th>第三人称男性</th><td>he</td></tr>
<tr></tr><th>第三人称女性</th><td>she</td></tr>
<tr></tr><th>第三人称中性</th><td>it</td></tr>
</tbody>
</table>
</body>
</html>
ウェブ・サーバー上で実行してウェブ・ブラウザで表示すると次のようになるはず。
第一人称 | I |
---|
第二人称 | you |
第三人称男性 | he |
第三人称女性 | she |
第三人称中性 | it |
この他にも重要な制御構文としてtry catch構文がある。これはエラー処理のためのもの。これについてはまたの機会に。まだまだつづく。
コメント
コメントを投稿