11

ウェブ全体[1] [2] [3]では、PHP 5.0.0 以降、「参照によって new の戻り値を割り当てる」と、PHP のバージョンに応じてE_DEPRECATEDorが返されると書かれています ( 5.3 までは存在しなかったため、その前だった)。E_STRICTE_DEPRECATEDE_STRICT

そのため、このコードはそのような警告を出す必要があると私は理解しています:

error_reporting(E_ALL | E_STRICT);

class A
{
}

$a =& new A();

ただし、これを 2 つのまったく異なるサーバー (PHP 5.3 を実行しているサーバーと PHP 5.2 を実行しているサーバー) で試しましたが、どちらも実際にはメッセージを出していません! どうしたの?私の理解は間違っていますか、それともこれらの 2 つのサーバーで何かおかしなことが起こっていますか?

(また、これが非推奨であることも奇妙だと思います。それは と$a = null; $b =& $a; $b = new A();同じことをしないのを見て$a = null; $b =& $a; $b =& new A();、しかし、非推奨とは何かを誤解した場合、それは問題の一部にすぎません...)

4

1 に答える 1

2

OPに応えて、このコメントは彼を正しい方向に向けました:

ここでの問題が他の場所にあるとしても、まったく驚かないでしょう: E_ALL | を設定してみてください。コマンドラインでこのコードを実行している場合は、php.ini で E_STRICT を直接変更してください。php-cli.ini も変更することを忘れないでください。
を実行して、エラーが非表示になっていないかどうかも再確認してくださいini_set('display_errors',1);1。これを Windows ボックスで実行している場合、これには過去にいくつかのバグがありました。

OPは、コードが実行される前に警告が生成されたことも指摘していたので、予想される警告は実行時ではなくコンパイル時に発生するという予感がしたので、 docsをもう一度見ました。そこで、私の疑念を裏付けるこの大きな赤いボックスのメモを見つけました。

ほとんどの E_STRICT エラーはコンパイル時に評価されるため、このようなエラーは、E_STRICT エラーを含めるように error_reporting が拡張されたファイルでは報告されません (逆も同様です)。

バージョン 5 の PHP は事実上「コンパイル済み」言語です (Java と同様に、コードは Zend Bytecode にコンパイルされます)。Zend エンジンがコンパイル時に発行されるエラーを含むコードをコンパイルする場合、スクリプト内error_reporting呼び出しは天候に影響を与えないか、これらのエラーが報告されません。error_reporting呼び出しは実行時エラー/警告にのみ適用されます。
おそらくこれ:これerror_reporting(E_ALL | E_STRICT | E_COMPILE_ERROR);も一見の価値あり

結論:
できる限り php.ini ファイルでエラー報告を設定してください。

于 2012-11-06T17:15:17.327 に答える