【PHPの基礎知識④】プログラム構造・構文
条件分岐
IF
- 書式1if (条件式①) {
①の条件を満たすときに実行する処理
}
- 書式2if (条件式①) {
①の条件を満たすときに実行する処理
} else {
①の条件を満たさないときに実行する処理
} - 書式3if (条件式①) {
①の条件を満たすときに実行する処理
} elseif (条件式②) {
①の条件を満たさないかつ②の条件を満たすときに実行する処理
} else {
①②ともに条件を満たさないときに実行する処理
}
if文は「aならばbを実行する」という構文を組み立てるときに使います。単純に「aならばbを実行する」という条件で収まらなければ、書式2や書式3の通り、elseやelseifと組み合わせて複合する条件式を組み立てます。
「aならばbを実行する」は「aという条件式がTRUEのときはbを実行する」と同じです。たとえば「if($a>=10){」は「$a>=10という条件がTRUEのときは」という条件です。よって「変数$boolがTRUEのときは」という条件を記述するときは「if($bool==TRUE){」と「==TRUE」を記述する必要はなく「if($bool){」と記述すれば済みます。
使用例
- ifを使って条件分岐する$int = 100;
if ( $int > 10 ) {
echo "abc"; →出力される
} - if ~ else を使って条件分岐する$int = 100;
if ( $int < 10 ) {
echo "123";
} else {
echo "abc"; →出力される
} - if ~ elseif ~ else を使って条件分岐する$int = 100;
if ( $int < 10 ) {
echo "123";
} elseif ( $int > 1000 ) {
echo "xyz";
} else {
echo "abc"; →出力される
}
IFとともに使われる関数
if文での条件の組立ては「if ($int > 10)」のように変数と値を比較したり、TRUEが戻り値となる関数などを使います。
- if文の条件式で良く使われる関数と主な用途
isset 変数がセットされていれば処理する empty 変数が空でなければ処理する is_array 変数が配列ならば処理する count 配列を指定数以上の要素があれば処理する preg_match 変数が指定した正規表現パターンにマッチすれば処理する strlen 変数の長さが指定数以上あれば処理する file_exists ファイルが存在すれば処理する defined 定数が定義されている時は処理する substr 指定値が変数に存在すれば処理する in_array 指定値が配列に存在すれば処理する isset関数やempty関数のように戻り値がTRUEとなる関数だけではなく、数値を返すcount関数やstrlen関数も良く使われ、これらの関数から返される数値を元に条件式が組み立てられています。
SWITCH
case 変数の値:
条件を満たすときの処理
break;
default:
いずれの条件も満たさないときの処理
}
使用例
switch ($int){
case 1:
echo "変数値は1です。";
break;
case 2:
echo "変数値は2です。"; →出力される
break;
default:
echo "どちらでもありません。";
}
ループ(処理を繰り返す)
WHILEループ
while文は「aを満たす間、bを繰り返す」という構文を組み立てるときに使います。
- 書式1while (条件式) {
条件を満たす間、実行する処理
}
<使用例>
$fp = fopen("aaa.txt", "r");
while (!feof($fp)) {
・・・
} - 書式2while (条件式) :
条件を満たす間、実行する処理
endwhile;
<使用例>
$fp = fopen("aaa.txt", "r");
while (!feof($fp)) :
・・・
endwhile; - 書式3do {
条件を満たす間、実行する処理
}while (条件式) ;<使用例>
$i = 0;
do {
$i++;
echo $i;
} while ( $i < 9 );
実行結果 123456789
FORループ
- 書式1for (条件式) {
条件を満たす間、実行する処理
}<使用例>
for ( $i = 0; $i < 10; $i++ ) {
echo $i;
}
実行結果 0123456789<解説>
この例はループカウンタ変数iが0から始まり9になるまでループ(繰り返し)します。条件式の「$i = 0; $i < 10; $i++」はセミコロン「;」で3つのパートに区切られています。ループに入るときに最初のパート[$i]=0
が実行され、カウンタに初期値がセットされます。繰り返しを開始する前に2番目のパート「$i < 10」で処理を継続するかどうか判断されます。繰り返す処理が実行された後、最後のパート「$i++」が実行されループカウンタ変数iが加算されます。この例では9まで出力した後、ループカウンタ変数iが加算されて10となり次回の実行時には「$i < 10」を満たさなくなるのでループを抜けます。 - 書式2for(条件式):
条件を満たす間、実行する処理
endfor;<使用例>
for ( $i = 0; $i <10; $i++ ):
echo $i;
endfor;
出力結果 0123456789
FOREACH
foriach文は、配列のデータを対象に繰り返し処理を実行できます。配列のデータをまとめて処理したいときに使います。
- 書式1foreach (配列 as 配列の値){
処理
}<使用例>
$array = array("あ", "い", "う", "え", "お");
foreach ($array as $value) {
echo $value;
}
出力結果 あいうえお
- 書式2foreach (配列 as 配列のインデックス => 配列の値){
処理
}<使用例>
$array = array("a" => "あ", "b" => "い", "c" => "う");
foreach ($array as $key => $value) {
echo $key.$value;
}
出力結果 aあbいcう
BREAK(ループや条件分岐を終了する)
break文は制御構造による処理を終了します。for文やwhile文はループを終了します。switch文では、これ以降の条件を判断せずに終了します。
- break文でforループを抜ける使用例$i = 0;
for (;;) {
if ($i > 9) {
break; → forループを抜ける
}
echo $i;
$i++;
}
出力結果 0123456789
<解説>
for(条件式)で指定する条件を省略して、ループの処理内部で break文によってループを抜けることができます。
CONTINUE(ループや処理をスキップする)
continue文はループ中に現在の繰り返し処理をスキップして次のループに移動します。
if ($i == 1) {
continue; →ループをスキップ
}
echo $i;
}
実行結果 0234
ファイルを読み込む
INCLUDE
include文はファイルを読み込んで評価します。ファイルが存在しないときはWarningメッセージが出力されますが、処理は継続します。読み込むファイルの場所はphp.iniのinclude_pathの設定を元に探されます。読み込むファイルを特定のディレクトリに配置するときは、このinclude_pathを設定しておくと良いでしょう。
- ファイルを読み込む文例include("abc.php"); ①
include "abc.php"; ②①②どちらも同じです。
インクルードファイルへの直接アクセスを回避する
インクルードするファイルは直接アクセスするものではありませんが、検索エンジンの巡回ロボットから等、なんらかの事情でインクルードファイルに直接アクセスされることも考えられます。このような場合は処理を中止するようなコードを記述しておくことで、システムの誤動作やインクルードファイルの目的以外での利用を回避することができます。
記述するコードとして定義済の「__FILE__」(現在のファイル)と、環境変数「$_SERVER["PHP_SELF"]」(現在のURL)を比較する必要があります。次の使用例をみてみましょう。
- test.phpecho "<p>__FILE__:".basename(__FILE__)";
echo "<p>PHP_SELF:".$_SERVER["PHP_SELF"];<解説>
このファイルを任意のスクリプトでインクルードした場合、__FILE__と$_SERVER["PHP_SELF"]の出力結果は次のようになります。
<出力結果>(インクルードされた場合)__FILE__:test.php
PHP_SELF:/web/phpdic/abc.php一方、test.phpをそのまま表示、つまり直接アクセスされた場合は、次のように同じ「test.php」を含む値となります。
<出力結果>(直接アクセスされた場合)__FILE__:test.php
PHP_SELF:/web/phpdic/test.phpこのようにインクルードファイルとして使用された場合と直接アクセスされた場合はで状況が異なります。これを利用して文字列比較関数を使って2つの値を比較することで直接アクセス時に処理を終了させることができます。
- インクルードファイルへの直接アクセスを回避する具体例if (stristr($_SERVER["PHP_SELF"],basename(__FILE__))){
die("直接アクセスされましたので終了します。");
}
INCLUDE_ONCE(ファイルを1度だけ読み込む)
include_once文はinclude文と同様、ファイルを読み込んで評価します。既にファイルが読み込まれているときは再度読み込みをしない点がinclude文との違いです。
- ファイルを1度だけ読み込む文例include_once("aaa.php"); ①
include_once "aaa.php"; ②
①②どちらも同じです。
REQUIRE
require文はファイルを読み込んで評価します。ファイルが存在しないときは処理は停止します。
- ファイルを読み込む文例require("aaa.php"); ①
require "aaa.php"; ②①②どちらも同じです。
REQUIRE_ONCE(ファイルを1度だけ読み込む)
require_once文はrequire文と同様、ファイルを読み込んで評価します。既にファイルが読み込まれている時は再度読み込みをしない点が、require文との違いです。
- ファイルを1度だけ読み込む文例require_once("aaa.php"); ①
require_once "aaa.php"; ②①②どちらも同じです。
TRY~CATCH(例外を処理する)
try~catch文は、例外をハンドリングするときに使います。tryブロックには、例外が発生する可能性がある処理を記述し、例外発生時の処理をcatchブロックに記述します。
例外が発生する可能性がある処理
}
catch (Exception $e) {
例外発生時の処理
}
- 例外を処理するtry {
if (!@$a = faile("aaa.txt")) {
throw new Exception("ファイルなし");
}
}
catch (Exception $e) {
echo $e->getMessage();
}<解説>
throw文で作成され、catchブロックに渡されるExceptionオブジェクトに対し、getMessegesメソッドを実行して例外メッセージを取得したり、getFileメソッドを実行して例外の発したファイル名を取得することができます。