1

サーバーは PHP5.3 を実行しています。ページが実行されるまでコードをコメントアウトすることで問題を発見しました。ページを最初にロードしたとき、エラーなしで出力が得られませんでした。

エラー報告を次のように設定しました。

error_reporting(E_ALL^E_NOTICE);
ini_set('display_errors', 1);

注: システムが古く、元々の記述が不十分だったため、通知を無効にする必要があります (現在、少しずつ解決しています)。

エラーなしでスクリプトの実行を停止した行は、この行でした。

<?php echo explode('cms/', pageURL())[0]?>

これは PHP5.4 で問題なく動作します。5.3 がこれをサポートしていないのは問題ありませんが、エラーが表示されないのはなぜですか? デバッグが非常に難しくなっている正確な理由は何ですか? これはさまざまな問題で 1 回か 2 回発生しており、根本的な問題をよりよく理解することをお勧めします。

この問題で 5.3 にエラーが表示される可能性はありますか?

サーバー上でエラー報告が機能しています。

poop();

戻り値

Fatal error: Call to undefined function poop()

編集:コードの更新中に編集に失敗し、これを含む行がありました:

$parts = echo explode('cms/',pageURL());

これにより、同じ問題が発生しました。出力なし、エラーなし。スクリプトは失敗するだけです。

4

5 に答える 5

4

背景情報:

error_reporting設定が関数呼び出し (設定ファイルではなく) を介してセットアップされている場合、読み込まれる最初のファイルで発生する構文エラー(例: index.php) PHP インタープリターはエラーを出力できません。

index.php致命的な構文エラーを含むファイルを含む非常に単純なファイルがある場合、PHP インタープリターはエラーを出力できます。

これは PHP インタープリターの「既知の制限」です。ほとんどのインタープリターは、最初にトークンを取得し、次にトークンが言語の文法を正しく表しているかどうかを評価するために、 2 つのパスでファイルを読み取る必要があるためです (トークンの順序は許可されています)。 .

実際のコードの実行は、インタープリターがこれら2 つのパスを正常に終了した後に行われます。error_reportingそうでない場合、インタープリターが持っているすべての情報は、構文エラーが発生したということです。ファイルから読み取ったものはすべて「無効な構文」であると見なされるため、何らかのレベルまたは別のレベルに設定されていることがわかりません。実行できません。

具体的な情報:

PHP 5.4 が提供する新しい構文言語構造を使用しているが、PHP 5.3 は提供していないため、正当な PHP 5.4 構造はPHP 5.3 では構文エラーになります。

error_reporting構文エラーと同じファイルに の呼び出しがあるということは、関数呼び出しが発生せず、エラー レベルが正しく設定されないことを意味します。

回避策:

php.iniファイルまたはファイルで宣言して、エラー レベルを設定し.htaccessます。

于 2013-11-12T08:43:57.283 に答える
2

ファイルを解析する前に解析エラーが発生する

次のコードを使用します。

<?php
error_reporting(E_ALL^E_NOTICE);
ini_set('display_errors', 1);

echo explode('cms/', pageURL())[0]

コンテンツを処理する前に、コードを解析する必要があります。デフォルトで表示エラーをオンにして実行すると、次のように表示されます。

解析エラー: 構文エラー、予期しない '['、',' または ';' が必要です index.php の 4 行目

または類似。解析エラーが発生した場合 - ファイルがまったく解析されない場合、エラーはファイルのコンテンツ (致命的なエラーであるため処理されない) の前に処理されるため、ファイルが解析される前のエラー報告設定ロードされたものが適用されます。

対照的に、これはエラーメッセージを表示します:

<?php
error_reporting(E_ALL^E_NOTICE);
ini_set('display_errors', 1);
require 'has_fatal_error.php';

<?php
// has_fatal_error.php;
echo explode('cms/', pageURL())[0]
于 2013-11-12T08:46:29.817 に答える
0

これについてはよくわかりませんが、この特定のタイプのエラーが に該当する可能性がありますE_STRICT。PHP 5.4 ではE_STRICTに含まれていましE_ALLたが、5.3 では含まれていませんでした。

これで修正されるかどうかに関係なく、エラー報告を次のように変更することをお勧めします。

error_reporting(E_ALL ^ E_NOTICE | E_STRICT);
于 2013-11-12T08:45:58.247 に答える
0

apache によってロードされた最初のファイルに解析エラーが含まれている場合、コードは実行されません。

于 2013-11-12T08:46:17.187 に答える