woshidan's blog

そんなことよりコードにダイブ。

htmlをまたぐ制御構造のブロック文について

関数の勉強をしていたら思っていたより長くなってしまって右往左往していたのですが、むしろ復習がてら今週は小分けにまとめていきますか。

 

PHPブロック(<?php ... ?>の塊)をまたぐ制御構造(ifなど)のブロック文が定義できます。

 

どういうことかというと、


<html>
<head>
	<meta charset='utf-8'>
</head>
<body>
<?php
$a = @$_GET['name'];
if($a === 'taro'){
?>

true

<?php
echo $a. 'さんなんですね',PHP_EOL;
}else{
	echo $a. 'さんだったんですか',PHP_EOL;
?>

else

<?php
}
?>

</body>
</html>

のように書いたとします。

<?php ... ?>で囲まれている部分はphpブロック、<?php ... ?>で囲まれている部分以外はhtmlです。

上のソースでは、ifのグループ文の両端の{}のうち}が来る前に一つ目のphpブロックが終わり、htmlに突入しています。

phpの制御構造の構文はふつう一つのphpブロックに収める必要があるのですが、上のソースみたいに一つのファイル中に収めているのであれば、制御構造のブロック文を間にhtmlの部分を入れながら、複数のphpブロックにわたって書くことが出来ます。

 

そのように複数のphpブロックにまたいで書いた、つまり制御構文の間にhtmlを入れて書いた場合、どうなるかというと、

もう面倒なのでifで話をしますが、ifの条件式の結果によってphpの実行結果に加えて、

制御構文にはさまれたhtmlコードが実行されるかが決まります。

trueの部分の{}にはさんだhtmlコードの結果はifの条件式がtrueにならなければ表示されず、

elseの部分の{}にはさんだhtmlコードの結果はifの条件式がelseにならなければ表示されません。

なお、実行結果の表示はhtml,php問わず同じ{}の中であれば上から書いてある順です。

 

実際どういうことかというと、上のphpのアドレスに、

?name=taroと付け加えるとtrue taroさんなんですねと出力されます。

trueの場合のecho $a. 'さんなんですね',PHP_EOL;とその{}にはさまれているhtmlコードに書かれた「true」が表示されている形です。

htmlのほうがphpのecho文より上にあるので、trueが先に来ています。

 

今度は、?name=satoとすると、satoさんだったんですか else とtrueの{}の間のhtmlに書いた部分は表示されず、elseのブロック文にあるecho $a. 'さんだったんですか',PHP_EOL; が実行され、

elseのブロック文にはさまれているhtmlコードのelseが実行されています。

htmlのほうがphpのecho文より下にあるので、elseが後に来ています。

 

たとえば変数の値でphpで出力する画面を変えたい場合など、

echo 'htmlタグ'で書いてたことがありますが、これを利用すると便利かもしれません。