37272


PHPのファイルの末尾記号?>は必要ですか？

フレームワーク等のコードを読んでいると、ファイル末尾に?>がありません。  
必要ないのでしょうか？  
初心者で申し訳ありませんが、ご回答をお願いいたします。


CC BY-SA 3.0
2017-08-17T06:58:04.207
37269
2017-08-17T08:57:35.393
24920
question
php
PHPのファイルの末尾記号?>は必要ですか？


フレームワークのコーディング規約で、「末尾の ?> を含めてはいけない」となっているものがあります。閉じタグがなくとも正常に動作します。  
<https://framework.zend.com/manual/1.12/ja/coding-standard.php-file-
formatting.html>

[code]

    <?php
    〜略〜
    ?>改行(許容される)
    改行(htmlに出力される)
    
[/code]

閉じタグの後に改行を入れるとhtmlに改行が出力され、ブラウザとしてはその改行をスペースとして認識します。スペースの挿入が無秩序に行われるのは不都合であるため、上記のような規約が生まれました。ファイルの行末に改行があるかどうか気にするより、いっそ閉じタグを書かないほうが合理的という考えです。

閉じタグを書く必要のある状況というのもありますが遭遇すれば見て分かる話ですし、「(不具合の原因になりやすいので)書く必要はない」という考えで良いです。


CC BY-SA 3.0
2017-08-17T07:59:42.950
37271
2017-08-17T07:59:42.950
2238
37269
answer


当然、PHPプログラムのコードだけで終了し、以降HTML出力は行われないと言う前提と解釈します。

**_必要ないのでしょうか？_**

はい、必要ありません。

ただし、それだけでなく **ファイルの末尾の`?>`は付けないことが公式サイトでも推奨** されています。

[PHP タグ](http://php.net/manual/ja/language.basic-syntax.phptags.php)

> ファイル全体が純粋な PHP
> コードである場合は、ファイルの最後の終了タグは省略するのがおすすめです。終了タグの後に余分な空白や改行があると、予期せぬ挙動を引き起こす場合があるからです。
> 余分な空白や改行のせいで PHPが出力バッファリングを開始し、その時点の内容を意図せず出力してしまうことになります。

(`?>`は「ファイルの末尾記号」ではなく、「PHPタグの終了タグ」ですね。当然、ファイルの末尾以外では必要になってくることもあります。)

記載内容は、PHPの学習がどこまで進んでいるかによっては意味がわかりにくいかもしれませんが、

  * 間違って`?>`の後ろに余計な改行や空白が存在するとその内容がHTML本体の一部として出力されてしまう。要りもしない内容をHTML本体として出力してしまうと、困ったことになることもある。

くらいに覚えておいてください。

(「PHPでレスポンスヘッダーを操作する」ようになるとわかりますが、その弊害は単にブラウザにとって「スペースの挿入が無秩序に行われるのは不都合である」なんて軽い(*)問題ではありません。)

* * *

以下は **弊害** についての若干の補足です。

(*)
htbさんの回答のコメントを読ませていただいて、若干誤解の恐れがあることにようやく気付いたので、補足です。HTMLに余分な空白が挿入されて例えばレイアウトが崩れるなんてこともそれはそれで大問題(お客様から指摘されて原因を探すために一晩徹夜なんてこともありました)なのですが、私の言う弊害は「PHPサーバがエラー停止して、全く機能しなくなる」と言う可能性があると言うのを含んでいます。(`body`タグより前なら、空白は無視されるだけと言う軽い意識のメンバーがいたせいで、完動していたシステムが全く動かなくなり、一晩徹夜どころでは済まない大騒ぎになったことがあります。)

多くの場合、[header](http://php.net/manual/ja/function.header.php)なんて関数が「HTML本体を出力してしまった後では動かない」と言うことに起因しているのですが、お時間とPHP学習の進行度合いにより調べてみて、わからない点がありましたら、またご質問くださればと思います。

(残念ながらPHP公式サイトのコード例の多くは、上記の「推奨」を守っていません。PHP公式サイトは非常に長い期間にわたって多くの人の手でメンテされてきているので、必ずしも最新の「推奨」に沿っていないこともあると思っておいた方が良いでしょう。)


CC BY-SA 3.0
2017-08-17T08:03:02.190
37272
2017-08-17T08:57:35.393
2017-08-17T08:57:35.393
13972
13972
37269
answer