1. ホーム
  2. php

[解決済み] なぜcloseタグを省略するのでしょうか?

2022-03-25 01:04:58

質問

PHPのcloseタグを使うのはよくないという話をよく聞きます。 ?> をファイル末尾に追加してください。ヘッダーの問題は、以下の文脈では無関係のようです(今のところ、これが唯一の正論です)。

最近のバージョンの PHP では、php.ini で output_buffering フラグを設定します。 出力バッファリングを有効にすると、返されたコードがすぐにブラウザに送信されないため、HTMLを出力した後にHTTPヘッダーやクッキーを設定することができます。

あらゆる優れた実践本やWikiはこの「ルール」から始まっていますが、誰も正当な理由を述べていません。 PHPの終了タグをスキップする正当な理由は他にあるのでしょうか?

どのように解決するのですか?

ヘッダーを通常より早く送信すると、重大な結果を招く可能性があります。以下は、今現在たまたま私の頭に浮かんだことの一部です。

  1. 現在のPHPのリリースでは、出力バッファリングがオンになっているかもしれませんが、実際の プロダクションサーバー 開発マシンやテストマシンよりも、あなたのコードをデプロイする先の方がはるかに重要です。そして、彼らは常に最新のPHPのトレンドに即座に従うとは限りません。

  2. 不可解なことに頭を悩ますことがある 機能低下 . 例えば、ある種の決済ゲートウェイを実装し、決済プロセッサによる確認が成功した後にユーザーを特定の URL にリダイレクトするとします。もし、何らかのPHPエラーや警告、あるいは行末の超過が発生した場合、支払いは処理されないままとなり、ユーザーは未請求のままとなる可能性があります。これも、無用なリダイレクトが悪であり、リダイレクトを使用する場合は、慎重に使用しなければならない理由の1つです。

  3. Internet Explorerでは、最新バージョンであっても、"Page loading canceled"のようなエラーが発生することがあります。これは AJAX response/json includeに本来含まれないはずのものが含まれています。これは、数日前に私が遭遇したのと同じように、一部のPHPファイルの過剰な改行が原因です。

  4. もし、いくつかの ファイルのダウンロード のアプリでは、このため、それらも壊れる可能性があります。ダウンロードが壊れるかどうかは、サーバーやブラウザ、ファイルの種類や内容によって異なるため、何年経っても気づかないかもしれません(他にも要因はあるかもしれません)。

  5. 最後に、以下のような多くのPHPフレームワークが シンフォニー , ゼンド とLaravel(には記載がありません。 コーディングガイドライン が、それに倣っている)と PSR-2規格 (2.2項)では、閉じタグの省略を要求しています。PHP のマニュアル自体 ( 1 , 2 ), ワードプレス , Drupal 他の多くのPHPソフトウェアも、そうするようにアドバイスしていると思います。単に標準に従うことを習慣にするだけなら(設定も PHP-CS-Fixer(フィクサー をコードに追加すれば、この問題を忘れることができます。そうでなければ、常にその問題を頭の片隅に置いておく必要があります。

おまけ:この2人のキャラクターに関連するいくつかのゴチャゴチャ(実は現在1つ)。

  1. よく知られたライブラリでも、以下のような余分な改行がある場合があります。 ?> . 例えば、Smartyは、2.*と3.*の両方のブランチの最新バージョンでさえ、これがあります。ですから、いつものように サードパーティのコードに注意 . ボーナス中のボーナス: PHP の不要な語尾を削除する正規表現: replace (\s*\?>\s*)$ を、PHP コードを含むすべてのファイルで空のテキストに変換します。