[解決済み] なぜcloseタグを省略するのでしょうか?
質問
PHPのcloseタグを使うのはよくないという話をよく聞きます。
?>
をファイル末尾に追加してください。ヘッダーの問題は、以下の文脈では無関係のようです(今のところ、これが唯一の正論です)。
最近のバージョンの PHP では、php.ini で output_buffering フラグを設定します。 出力バッファリングを有効にすると、返されたコードがすぐにブラウザに送信されないため、HTMLを出力した後にHTTPヘッダーやクッキーを設定することができます。
あらゆる優れた実践本やWikiはこの「ルール」から始まっていますが、誰も正当な理由を述べていません。 PHPの終了タグをスキップする正当な理由は他にあるのでしょうか?
どのように解決するのですか?
ヘッダーを通常より早く送信すると、重大な結果を招く可能性があります。以下は、今現在たまたま私の頭に浮かんだことの一部です。
-
現在のPHPのリリースでは、出力バッファリングがオンになっているかもしれませんが、実際の プロダクションサーバー 開発マシンやテストマシンよりも、あなたのコードをデプロイする先の方がはるかに重要です。そして、彼らは常に最新のPHPのトレンドに即座に従うとは限りません。
-
不可解なことに頭を悩ますことがある 機能低下 . 例えば、ある種の決済ゲートウェイを実装し、決済プロセッサによる確認が成功した後にユーザーを特定の URL にリダイレクトするとします。もし、何らかのPHPエラーや警告、あるいは行末の超過が発生した場合、支払いは処理されないままとなり、ユーザーは未請求のままとなる可能性があります。これも、無用なリダイレクトが悪であり、リダイレクトを使用する場合は、慎重に使用しなければならない理由の1つです。
-
Internet Explorerでは、最新バージョンであっても、"Page loading canceled"のようなエラーが発生することがあります。これは AJAX response/json includeに本来含まれないはずのものが含まれています。これは、数日前に私が遭遇したのと同じように、一部のPHPファイルの過剰な改行が原因です。
-
もし、いくつかの ファイルのダウンロード のアプリでは、このため、それらも壊れる可能性があります。ダウンロードが壊れるかどうかは、サーバーやブラウザ、ファイルの種類や内容によって異なるため、何年経っても気づかないかもしれません(他にも要因はあるかもしれません)。
-
最後に、以下のような多くのPHPフレームワークが シンフォニー , ゼンド とLaravel(には記載がありません。 コーディングガイドライン が、それに倣っている)と PSR-2規格 (2.2項)では、閉じタグの省略を要求しています。PHP のマニュアル自体 ( 1 , 2 ), ワードプレス , Drupal 他の多くのPHPソフトウェアも、そうするようにアドバイスしていると思います。単に標準に従うことを習慣にするだけなら(設定も PHP-CS-Fixer(フィクサー をコードに追加すれば、この問題を忘れることができます。そうでなければ、常にその問題を頭の片隅に置いておく必要があります。
おまけ:この2人のキャラクターに関連するいくつかのゴチャゴチャ(実は現在1つ)。
-
よく知られたライブラリでも、以下のような余分な改行がある場合があります。
?>
. 例えば、Smartyは、2.*と3.*の両方のブランチの最新バージョンでさえ、これがあります。ですから、いつものように サードパーティのコードに注意 . ボーナス中のボーナス: PHP の不要な語尾を削除する正規表現: replace(\s*\?>\s*)$
を、PHP コードを含むすべてのファイルで空のテキストに変換します。
関連
-
[解決済み】PHP 7.2 - Warning: count(): パラメータは配列かCountableを実装したオブジェクトでなければならない [解決済み]
-
[解決済み】php, mysql - データベースへの接続数が多すぎるエラー
-
[解決済み] php5パッケージのインストール候補がない (Ubuntu 16.04)
-
[解決済み】警告。数値でない値に遭遇しました
-
[解決済み] * vchiqインスタンスを開くのに失敗しました。
-
[解決済み] [Solved] Fatal error: メンバ関数 query() の null への呼び出し。
-
[解決済み] Forbidden :このサーバーの /phpmyadmin にアクセスする権限がありません。
-
[解決済み] PHPの配列を別の配列にコピーする関数はありますか?
-
[解決済み] mysql_field_nameを新しいmysqliに変更します。
-
[解決済み] なぜJavaScriptのeval関数を使うとダメなのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】「初期通信パケットの読み込み」でMySQLサーバーに接続できなくなり、システムエラーになる。0
-
[解決済み】「セッションキャッシュリミッターを送信できません - ヘッダーはすでに送信されています」【重複】。
-
[解決済み】php, mysql - データベースへの接続数が多すぎるエラー
-
[解決済み】 $_SERVER['DOCUMENT_ROOT'] と $_SERVER['HTTP_HOST'] の違いについて]
-
[解決済み】mysqli_select_db()は、パラメータ1がmysqliであることを期待し、文字列が与えられる。
-
thinkphp5 timestamp 非整形の数値に遭遇した。
-
[解決済み】Wordpressの子テーマのstyle.cssが効かない。
-
[解決済み】mysqli::query(): mysqli をフェッチできない
-
[解決済み] 致命的なエラーです。mysqli_result 型のオブジェクトを使用できません [終了] 。
-
[解決済み】なぜ一部のスクリプトでは、PHPの終了タグである'?>' が省略されるのでしょうか?重複