2

私は本当に単純なテストケースを持っています。終了タグがあり、a意図的に追加されています。

<?php echo 'test'; a?>

そして、終了タグなし、意図的に終了タグなし:

<?php echo 'test'; a

いつdisplay_errors = On

  • 終了タグ付き=>テスト注意:未定義の定数aの使用-3行目のtest.phpで「a」と見なされます

  • 終了タグなし=>解析エラー:構文エラー、3行目のtest.phpで予期しない$end

いつdisplay_errors = Off

  • 終了タグ付き=>テスト

  • 終了タグなし=>HTTP500

HTTP 500エラーが発生するのはなぜですか?そして、なぜ出力(エラーメッセージを除く)がdisplay_errorsオプションに依存しているのですか?エラーが出力されるかどうかを決定するだけだと思いました。これはバグですか?

4

4 に答える 4

0

終了タグがないと、phpインタープリターはスクリプトがどこで終了するかを判別できません(したがって、パーサーエラーで終了します)。

しかし、それを閉じると、「a」が定数として解析されます。ただし、定数「a」はないため、文字列と見なされ、パーサーはこの文字列値を返します。それを受け取る変数がないので、それはただ捨てられます。(おそらく、アプリケーションに影響を与えないため、パーサーはこれを削除するだけです)。

于 2012-10-26T21:45:45.357 に答える
0

この理由は次のとおりです。

PHPは終了?>タグを認識すると、暗黙のセミコロンを追加します。これにより、次のような構文が可能になります。

<?php echo "something" ?>

なぜこれが重要なのですか?

これは、終了タグがある場合、迷子aが実際にはとして表示されることを意味するためですa;

この違いは、PHPがそれを解析するのに十分です。それはそれを認識しないので、それは未知の定数であると推測し、あなたはあなたが見る通知メッセージを受け取ります。

終了タグがなく、セミコロンがない場合、PHPはコードの終了していない行を認識します。これは構文エラーです。PHPはそれをまったく解析できないので、あきらめます。

それが違いを説明することを願っています。

(ちなみに、文字列が不明で一定であると仮定することは、PHPの最悪の間違いの1つです。これは歴史的な理由からありますが、ある時点で非推奨になることを願っています。将来;マイナーなタイプミスによって引き起こされる恐ろしいバグに対してコードを広く開いたままにします)

于 2012-10-26T21:51:10.147 に答える
0

これは、PHPのパーサーと文法の下品です。

PHPでは、T_CLOSE_TAGの前のセミコロンを省略できるため、PHPパーサーがこれを認識すると次のようになります。

a?>

それはあなたがこれを意味したと仮定します:

a; ?>

次に、未定義の定数 aを文字列に強制し、。を発行しE_NOTICEます。(これはPHPのひどい誤動作です。)したがって、これは実際には次のようになります。

'a'; ?>

これは致命的なエラーではなく、この式には副作用がないため、プログラムは通常どおり実行されます。

ただし、closeタグを省略すると、式の終わりを示すものがないため、構文エラーが発生します。構文エラーは致命的で500 Internal Server Errorあり、応答も致命的です。

このdisplay_errors設定は、エラーが応答に出力されるかどうか(つまり、noticeparse errorメッセージが表示されるかどうか)にのみ影響します。

于 2012-10-26T21:56:01.133 に答える
0

結果は異なります。OPが言うように、終了タグなしのコードは、私にとって500エラーを引き起こしていません。

<?php
error_reporting(0);
ini_set('display_errors', 0);
echo 'test'; a

代わりに私は得る:

Parse error: syntax error, unexpected $end in /my-path/test/index.php on line 4

于 2012-10-26T22:02:51.023 に答える