ブログ

PHPプログラムの終端を示す記述を書くこと、書かないこと、その違い

pg

WordPressのプログラムはPHPというプログラム言語で書かれています。

通常PHPのプログラムは、拡張子「.php」のファイル内で

<?php

からはじまり

?>

までの範囲をプログラムと認識します。
正確には <? からはじまる場合もプログラムとして扱われるように設定されている場合がありますが、サーバの設定によるため必ず動作するものではありません。(使用されているサーバやサーバの設定を確認してください)

終端記号を書かないとどうなる?

PHPのプログラムは原則はこのような前提ですが、終端を表す

?>

がファイルの末尾に限り記述されていないケースを見かけたことはないでしょうか?
PHPではプログラムの範囲は <?php から ?> までとなっていますが、先端は必須でここからプログラムが始まるという記述になっていますが、その一方で終端は省略が可能で、省略した場合はそのファイルの最後までがプログラムと認識する仕様になっています。

本来は終端が明示的に指定されている方が良いようにも思うところですが、記載しないことにはハッキリとしたプログラマの意思があります。どのような効果があるかを具体的に掘り下げることで理解が進むことでしょう。

PHPプログラムの終端の指定による動作の違い

指定の動作の違いを見る前に、基本となる通常の終端指定を行った場合の出力のされ方について確認します。
純粋にプログラム言語としてのPHPで確認しますので、ブラウザで表示した際の改行等は別の議論ですので混同されないようご注意ください。(ブラウザ表示時の改行は br タグ等を使用しますので指定方法自体が異なります)

 

実験1

下記の実験コードを実行した結果は以下の通りとなります。

<?php print "test1"; ?>
<?php print "test2"; ?>

 

endmark_sample1

見て頂くと分かるように、2行目の「test2」が続けて表示されています。
基本的には ?> の後の改行は無視されるという動作になります。

実験2

次に、1行目にあるPHPの終端の後に改行を入れた場合です。

<?php print "test1"; ?>

<?php print "test2"; ?>

 

endmark_sample2

実験1での結果から予想できる通り、1行目の終端後の改行が無視された結果、見た目上は普通に改行されたものと同じ結果となっています。

実験3

さらに2行目のファイルの末尾に近いPHPの終端の後に改行を入れた場合はどうでしょうか。

<?php print "test1"; ?>

<?php print "test2"; ?>
 

 

endmark_sample3

基本仕様通り、当然のように終端後の改行は無視されています。

実験4

念のため、2行目のPHPの終端の改行後にさらに改行を追加した場合も確認してみます。

<?php print "test1"; ?>

<?php print "test2"; ?>
 
 

 

endmark_sample4

ようやく改行が追加されました。

実験5

さらに意地悪なパターンで、実験3にある2行目の終端の後にブランク(スペース、空文字)を追加した状態を確認します。

<?php print "test1"; ?>

<?php print "test2"; ?> 
 

 

endmark_sample5

実は終端直後にスペースを含む何らかの文字が含まれている場合、改行を無視する仕様が発動されなくなる仕組となっています。
簡単なサンプルでの実験のためわかりにくかったかもしれませんが、PHPの記述方法はイメージが直感的でわかりやすい反面、終端の後に何が指定されているかによって微妙に動作が変わってしまいます。

ブラウザでHTMLを表示するだけならばほぼ気にならないかもしれませんが、たとえばプラグインなどでAjaxを使用してバックエンドで処理を行う、RSSフィードでサイト間連携を行うなど、定められたフォーマットが求められる場合に不要なブランクがあるなどで動作不良を起こすことがあります。その際、終端後に記載された意図しない何らかのデータによって不具合が生じることを防ぐため、それ以降にHTMLなどのデータ出力がない場合は、終端を記載せず、ファイル終端までプログラムとなるように取り扱うことでこの仕様が発動しないようにする工夫が行われます。
不本意な不具合の防止のために意図して記載していないケースがプラグインなどを中心に多いのもこのためと言えるのではないでしょうか。

関連記事

WP-Ranking PRO
ページ上部へ戻る