PHP - 制御構文
- 条件式
- もし~ならば(if, else, elseif, else if)
- ~のあいだ(while)
- ~のあいだ(do while)
- ~のあいだ(for)
- 配列処理(foreach)
- ループを抜ける(break)
- ループ処理をスキップする(continue)
- スイッチ(switch, case, default)
- end~構文(endif, endwhite...)
- 外部ファイル読み込み(require, require_once)
- 外部ファイル読み込み(include, include_once)
- ジャンプ(goto)
- 例外(Exception, throw, try, catch, finally)
- プログラムの終了(exit, die)
条件式
if (...), while (...) などには、真(true)か偽(false)かを示す条件式を記述します。
if ($count > 10) {
echo "BIG\n";
}
下記のものは、偽(false)とみなされます。
if (false) { ... } // boolean型のfalse
if (0) { ... } // integer型の0
if (0.0) { ... } // float(double)型の0.0
if ("") { ... } // 空の文字列
if ("0") { ... } // 文字列 "0"
if (array()) { ... } // 要素数が0個の配列
if (null) { ... } // 特殊変数null
if ($aaa) { ... } // 未定義の変数
文字列を比較する際には、== を用いると暗黙の型変換により正確な比較ができなくなるため、厳密比較の === を用いるのが鉄則です。
if ("100" == "100.0") { ... } // 真(true)になってしまう
if ("100" == "10e1") { ... } // 真(true)になってしまう
if ("100" == "0100") { ... } // 真(true)になってしまう
if ("100" === "100.0") { ... } // 偽(false)になる
if ("100" === "10e1") { ... } // 偽(false)になる
if ("100" === "0100") { ... } // 偽(false)になる
もし~ならば(if, else, elseif, else if)
if は「もし」を意味します。(...) の中に記述した式が真であれば、{ ... } の中の処理を実行します。下記の例では、$var の値が 10より大きければ BIG を表示します。
if ($var > 10) {
echo "BIG\n";
}
else は「さもなくば」を意味します。下記の例では、$var が 10より大きければ BIG を、さもなくば SMALL を表示します。
if ($var > 10) {
echo "BIG\n";
} else {
echo "SMALL\n";
}
elseif は「さもなくばもし」を意味します。下記の例では、$var が 10より大きければ BIG を、10と等しければ NORMAL を、さもなくば SMALL を表示します。
if ($var > 10) {
echo "BIG\n";
} elseif ($var == 10) {
echo "NORMAL\n";
} else {
echo "SMALL\n";
}
else if も elseif と同じ意味を持ちます。
if ($var > 10) {
echo "BIG\n";
} else if ($var == 10) {
echo "NORMAL\n";
} else {
echo "SMALL\n";
}
~のあいだ(while)
while は「~の間」を意味します。$i の値が 10よりも小さい間、$i の値を表示します。
$i = 0;
while ($i < 10) {
echo "$i\n";
$i++;
}
~のあいだ(do while)
do while は「~を実行する(~の間)」を意味します。$i の値が 10よりも小さい間、$i の値を表示します。条件を満たしていなくても最低 1回はループ処理が実行される点が while文と異なります。
$i = 0;
do {
echo "$i\n";
$i++;
} while ($i < 10);
~のあいだ(for)
for も「~の間」を意味します。$i に 0 を代入し、$i の値が 10より小さい間、$i の値を加算(インクリメント)しながら、ループ処理を実行します。下記の例は、echo処理を10回繰り返します。
for ($i = 0; $i < 10; $i++) {
echo "$i\n";
}
配列処理(foreach)
foreach (配列 as 変数) は配列の個々の要素に対して変数に要素を代入しながら処理を実行します。
$color_list = array("Red", "Green", "Blue");
foreach ($color_list as $color) {
echo "$color\n"; // Red, Green, Blue が表示される
}
文字列を添え字とする配列の場合は次のようにします。
$array = array(
"Sun" => "Sunday",
"Mon" => "Monday",
"Tue" => "Tuesday",
);
foreach ($array as $key => $value) {
echo "$key = $value\n";
}
ループを抜ける(break)
break は for、foreach、while、do などのループ処理を抜けます。下記の例では、$i が 5の時に forループを抜けます。
for ($i = 0; $i < 10; $i++) {
if ($i == 5) {
break;
}
}
ループ処理をスキップする(continue)
continue は for、foreach、while、do などにおいて、残りのループ処理をスキップします。次の例では、$i が 5の時のみ、echo を実行しません。
for ($i = 0; $i < 10; $i++) {
if ($i == 5) {
continue;
}
echo "$i"; // $i が 3の時は実行されない
}
スイッチ(switch, case, default)
switch, case は、値によって処理を振り分けます。次の例では、$day の値が "Sun" の時は "Sunday"、"Mon" の時は "Monday"、"Tue" の時は "Tuesday"、さもなくば "Unknown" を表示します。default には、どの値にもマッチしなかった場合の処理を記述します。
$day = "Sun";
switch ($day) {
case "Sun":
echo "Sunday\n";
break;
case "Mon":
echo "Monday\n";
break;
case "Tue":
echo "Tuesday\n";
break;
default:
echo "Unknown\n";
break;
}
break文が無い場合、次の条件の式まで実行されます。下記の例では、$day が "Mon" の時は "Monday" が表示されますが、"Sun" の時は "Sunday" と "Monday" が表示されます。
$day = "Sun";
switch ($day) {
case "Sun":
echo "Sunday\n";
// break; が無い
case "Mon":
echo "Monday\n";
break;
default:
echo "Unknown\n";
break;
}
end~構文(endif, endwhite...)
if (...) { ... }, while (...) { ... } などの構文を、コロン(:)と endif; などを用いて下記の様に記述することもできます。
if ($n == 1):
// ...
elseif ($n == 2):
// ...
else:
// ...
endif;
while ($n == 1):
// ...
endwhile;
for ($i = 0; $i < 10; $i++):
// ...
endfor;
foreach ($array as $val):
// ...
endforeach;
switch ($n):
// ...
endswitch;
外部ファイル読み込み(require, require_once)
require は指定したファイルを読み込み、PHPファイルとして実行します。
require 'sample.php';
require_once も指定したファイルを読み込みますが、同じファイル名を指定した場合、最初の 1回だけ読み込まれる点が異なります。
require_once 'sample.php'; // 読み込まれる require_once 'sample.php'; // 2回目なので読み込まれない
外部ファイル読み込み(include, include_once)
include, include_once も require, require_once と同様に外部ファイルを読み込みますが、読み込みに失敗した場合、require, require_once の場合は E_COMPILE_ERROR エラーが発生しますが、include, include_once の場合は E_WARNING 警告のみが発行されます。
include 'common.php'; include_once 'sample.php';
ジャンプ(goto)
goto を用いて、プログラム上の指定したラベルの位置にジャンプすることができます。多重のループから抜ける場合などに使用されます。下記の例では、$i, $j がいずれも 50の時にループを抜けて、end: ラベルの位置にジャンプします。
for ($i = 0; $i < 100; $i++) {
for ($j = 0; $j < 100; $j++) {
if ($i == 50 && $j == 50) {
goto end;
}
}
}
end:
echo "i = $i, j = $j\n";
例外(Exception, throw, try, catch, finally)
throw は、エラーが発生した際に例外(Exception)を投げます。例外が throw されると、関数やメソッドの残りの処理はスキップされます。try { ... } catch の構文は、{ ... } の中、もしくは、{ ... } から呼び出された関数やメソッドの中で投げられた例外を受け取ります。例外を受け取ると、try { ... } の処理はスキップされ、catch() { ... } の処理が実行されます。
function divide($x, $y) {
echo "divide(START)\n";
if ($y == 0) {
// $y が 0 の場合、例外を throwして残りの処理をスキップする
throw new Exception("Divided by zero.");
}
echo "divide(END)\n"; // 例外がthrowされるとこの行以降は実行されない
return $x / $y;
}
try {
echo "Debug1\n";
echo divide(8, 0) . "\n";
echo "Debug2\n"; // 例外がthrowされるとこの行は実行されない
} catch (Exception $e) {
echo "ERROR: " . $e->getMessage() . "\n";
}
PHP5.5 以降では、finally がサポートされました。final ブロックは、例外の有無に関わらず必ず実行されます。
try {
echo divide(8, 0) . "\n";
} catch (Exception $e) {
echo "ERROR: " . $e->getMessage() . "\n";
} finally {
echo "FINALLY\n"; // 例外の有無に関わらず必ず実行される
}
Exception のサブクラスを作成することで、例外の種別を拡張することができます。
class MyException1 extends Exception {
}
class MyException2 extends Exception {
}
try {
throw new MyException2("MyException2");
} catch (MyException1 $e) {
echo "MyException1\n"; // 実行されない
} catch (MyException2 $e) {
echo "MyException2\n"; // 実行される
} catch (Exception $e) { // 親クラス例外はサブクラスより後ろに記述する
echo "Exception\n"; // 実行されない
}
プログラムの終了(exit, die)
exit() や die() は、プログラムを終了させます。引数にはプログラムの終了コードを指定します。通常は、正常時は 0、異常時は 0 以外の値を指定します。
echo "AAA\n";
exit(1);
echo "BBB\n"; // プログラムが終了するので、この行は実行されない