PHP 5.3ではnewの戻り値を参照で代入するのはdeprecatedでした。したがって、PHP 5.3でnewの戻り値を参照で代入
$obj =& new Foo();
はE_DEPRECATED
というエラーをスローします。
レガシーコードの多い大規模アプリケーションを5.3にアップグレードすると、多くの不要な通知が表示されます。
この問題の潜在的な修正として、正規表現を使用して、=& new
のすべてのインスタンスを検索して、= new
に置き換えることを検討しています。たとえば、次の例は、すべてのPHPファイルを検索し、=& new
のすべてのインスタンスを一掃します:
find ./ -name '*.php' | xargs perl -p -i -e 's/=(\s*)&(\s*)?new\b/= new/g'
:
- それがうまく動作しますか?私はどのような潜在的な問題に直面するでしょうか?
- そうでない場合、を
= new
に置き換えると、PHP 5.3の動作が変更されます。 - これを使用する一般的なライブラリの例は、問題を引き起こすことが知られています。
=& new
の膨大な量を扱うために他にどのようなアイデアをお勧めしますか?
これはうまくいくと思われますが、問題が発生する可能性のあるエッジのケースを探しています。はい、私はちょうどエラー報告の設定を変更することができます知っています。しかし、私は通知を隠したくない、私はそれらを修正したい。
E_DEPRECATEDは通知のクラスに属し、エラーはありません。私はあなたがそれを修正して急いでする必要があるか分からない(magic_quotesはphp 4.2で廃止されたと宣言されていた)。正規表現については、 'new 'の後ろに' \ b'を追加する必要があります。それ以外の場合は、実行可能な書き換えアプローチです。しかし、期待される処理ロジックが損なわれているかどうかだけをテストすることは可能です(ただし、そうは思わないでしょう)。 – mario
@mario E_DEPRECATEDは単なるエラー*レベル*です。いずれにしてもそれを参照するのが適切でしょう。しかし、\ bとの良い点。 – mfonda