PHP 文法2
制御構造
PHP での制御構造は C や Perl のそれと大きな違いはありませんので、特に注意点が無い限りは例だけ示します。
if
if ($a > $b) print "$a\n"; if ($a > $b) { print "$a\n"; $b ++; } if ($a > $b) { print "$a\n"; } else { print "$b\n"; } if ($a > $b) { print "$a\n"; } elseif ($a < $b) { print "$b\n"; } else { print "...\n"; }
更に、「if」「while」「for」「foreach」「switch」は、次のような記述法で記述することもできます。開き波括弧をコロン(:)、閉じ波括弧をそれぞれ「endif;」「endwhile;,」「endfor;」「endforeach;」「endswitch;」と変更します。
<?php if ($a > $b): ?> 命令〜〜 <?php endif; ?> if ($a > $b): print "True"; elseif ($a < $b): print "False"; else: print "..."; endif;
while
$i = 1; while ($i <= 5) { print "$i"; $i ++; }
Do ... While
$i = 0; do { print $i; } while ($i > 0);
for
for ($i = 1; $i <= 10; $i++) { print $i; } for ($i = 1;;$i++) { if ($i > 10) { break; } print $i; } $i = 1; for (;;) { if ($i < 10) { break; } print $i; $i++; } for ($i = 1; $i <= 10; print $i, $i++) ;
foreach
Ex1) foreach(array_expression as $value) 文 Ex2) foreach(array_expression as $key => $value) 文
Perlのそれとほぼ同様で、PHP4からサポートされています。Ex1ではarray_expression
で指定した配列に関してループ処理を行います。現在の要素の値が $value
に代入され、内部配列ポインタが一つ前に進められます。そのことによって、次のループでは次の要素を見ることとなるわけです。Ex2では各ループで現在の要素のキーが変数 $key
に代入されるところが異なります。 ただし、これらは指定した配列自体に対してではなく、そのコピーに対して処理を行っています。このため、「each()
」のように配列ポインタの位置が変更されることもなく、返される配列要素への変更が元の配列に反映されることもありません。また、foreach
の実行開始時に、配列ポインタは先頭要素を指すように自動的にリセットされるので、「reset()
」のコールは不必要です。「@」によるエラーメッセージ出力を抑制する機能は未対応となっています。
foreach ($array as $value) { echo "$value"; } foreach ($array as $key => $value) { echo "$key; : $value"; }
break
現在実行中の「for」「foreach」「while」「do..while」「switch」の実行を終了します。オプションの引数でネストしたループ構造を抜ける数を指定することもできます。
continue
ループ構造内で、現在の残りの処理をスキップし、次の繰り返しの最初から実行を続けるために使用されます。「break
」同様、オプションの引数で、処理をスキップするループ構造のレベル数を指定できます。
swich
「default
」は全てのcase
にマッチしない場合の文となり、一番最後におく必要があります。もし、「break
」を忘れると、swich
内で次のbreak
を見つけるまで処理を繰り返し行うことになります。下の例で、$iが0の場合、break
が無いと「012...」と出力されてしまうので注意が必要です。
switch ($i) { case 0: print "0"; break; case 1: print "1"; break; case 2: print "2"; break; default: print "..."; }
return
関数内で呼び出されると、return()
文はその関数の実行を停止し、引数を関数の値として返します。また、eval()
文やスクリプト自体の実行を終了させることもできます。 グローバルスコープで呼び出されると、現在実行中のスクリプトが終了します。もしそのスクリプトがinclude()
もしくは require()
されたものであれば、制御は呼び出し元のファイルに戻ります。また、そのスクリプトがinclude()
されたものである場合は、return()
に与えられた引数の値はinclude()
の戻り値となります。return()
がメインスクリプトで呼び出された場合はスクリプトが終了します。
require/include
require()
とinclude()
は、エラーの扱い方を除いてほぼ同様となっています。エラーが発生すると include()
はWarning
を出力しますが、require()
を使用している場合は Fatal Error
となります。つまり、指定されたファイルが無い場合に処理を停止したい場合は require()
を使用した方が良いでしょう。逆に、include()
を使用すると、読み込むファイルが存在しない場合も処理が続行されます。ファイルが読み込まれると、そのファイルに含まれるコードは include()
もしくはrequire()
が実行された行の変数スコープを継承します。呼び出し側の行で利用可能である全ての変数は、読み込まれたファイル内で利用可能となっています。
require_once/include_once
require/include
と同様の振る舞いをしますが、既にコードが読み込まれている場合には再度読み込まれることがないという性質を持っています。スクリプトの実行時に、同じファイルが複数回読み込まれ評価される可能性がある場合に、関数の再定義や 変数値の再代入といった問題を回避するために一回だけ読み込ませる目的で使用されます。
ユーザ定義関数
あらかじめ命令等を一まとめにし、必要に応じて呼び出すものをサブルーチンと呼びますが、そのサブルーチンを定義してスクリプト内から利用することができる形にしたものを「ユーザ定義関数」と呼びます。関数を定義するために「function」というステートメントを使用します。
function samp_bold($text) { $text = "<b>$text</b>\n"; return($text); }
関数名は変数の命名規則と同様であり、大文字と小文字の区別はされません。functionステートメントの後には必ず半角スペースを記入し、関数名の後に引数を指定する括弧「( )」を記入します。関数に渡す引数には、数値、変数、配列などを指定することができ、カンマで区切ることによって複数指定も可能です。変数を引数に渡し、関数内で編集(値の再代入)をしたとしても、変数の値そのものは関数の中だけで変化し、関数の外ではまったく変化しません。ただし、引数に「&」をつけると、「参照渡し」となり、引数として渡された変数自体の値を変化させることができます。つまり、関数の外にある変数を引数として渡された場合、結果としてその変数の値が変化することとなるのです。