web-dev-qa-db-ja.com

PHP 5.4:警告を無効にする "空の値からデフォルトオブジェクトを作成しています"

PHP 5.2から5.4にコードを移行したいと思います。使用するすべてのコードが、初期化なしでメンバーを持つオブジェクトを使用するだけで広範囲に使用することを除いて、これはこれまでうまくいきました。

$MyObject->MyMember = "Hello";

その結果、「空の値からデフォルトオブジェクトを作成しています」という警告が表示されます。

解決策は次のようにすることです:

$MyObject = new stdClass();
$MyObject->MyMember = "Hello";

しかし、これをすべてのコードで変更するのは大変な作業になります。これは、さまざまなプロジェクトで何度も使用しているためです。いいスタイルではありませんが、残念ながら、今後数週間かけてすべてのコードにこれを追加することはできません。

Php error_reportingを警告を報告しないように設定できることはわかっていますが、他の警告や通知を引き続き取得できるようにしたいと考えています。この警告は、E_STRICTを有効または無効にしてもまったく影響を受けないようです。この警告を無効にする方法はありますか?

10
Werner

技術的には、あなたが警告を出すために 独自のエラーハンドラをインストールする でこれを行うことができます。ハンドラー内から文字列エラーメッセージを確認します。抑制したい場合はreturn true、 さもないと return falseを使用すると、デフォルトのエラーハンドラーで処理を実行できます。

ただし、この誤用が発生した場合は、正しいことを行い、コードを手動で修正することをお勧めします。これが有給の仕事でない場合(その場合、通常、実装の純粋さを無効にする懸念があります)、これを教訓として考え、正しいことを行ってください。

8
Jon

Php error_reportingを警告を報告しないように設定できることはわかっていますが、他の警告や通知を引き続き取得できるようにしたいと考えています。

エラー報告を無効にせず、適切なレベルのままにしますが、 display_errors ディレクティブを無効にします。

ini_set('display_errors', 0);

製造中に画面に通知を印刷する理由はありません。

次に、Jonが言ったように、カスタムエラーハンドラーを使用します(まだ使用していない場合)。

function my_error_handler($error_level, $error_message)
{
    // write error message to log file
}
set_error_handler('my_error_handler');

エラー報告レベルをset_error_handlerの2番目のパラメータに渡すことができます。このようにして、時間をかけて正しいことを行うことができます。つまり、通知を生成しないようにコードを修正します。

多くのサイトを5.4に移動する場合は、すべてを修正するのに十分な時間があるまで、php.iniのdisplay_errorsをサーバー管理者にオフにしてもらうことができます。さらに良いのは、アップグレードする前にすべてをステージングして修正することですが、それはオプションではないかもしれません。

4
Wesley Murch

あなたは本当にIDE for phpを使用してこれを試すことができます:

検索する $MyObject->MyMember = "Hello";

結果を探し、適切な結果が得られた場合は、次のものに置き換えてみてください。

$MyObject = new stdClass();
$MyObject->MyMember = "Hello";

IDEはあなたのために長い仕事をするでしょう...

1
Komdev

私は同じ問題を抱えていましたが、実稼働環境では次のように扱います

    \error_reporting(\E_ERROR);

私のアプリケーションはエラーを必要とせず/生成しないと言わなければなりません、それは非常に制御された環境にあるので、これを行うことはそれほど害にはなりませんが、アプリケーションがエラーを起こしやすいものである場合は、あなたが所有する必要があります error handler および適切な正規表現と preg_match を使用すると、“Creating default object from empty value”警告を無視し、ユーザーの判断で他のユーザーをログに記録/プロンプトを出します。

0
dariush