質問
PHPに致命的なエラーを発生させるのではなく、クラスの再宣言を無視させる方法はありますか?または、少なくとも例外をスローしますか?(私はそれを簡単にキャッチして続行することができました(また、試行された自動ロードのログも記録します)。)
私はノーだと思います、そして致命的なエラーは致命的なエラーです-結局のところ、100のケースのうち99で、それは合理的に賢明な振る舞いです-そして私はおそらくそれがケースでトリガーされるインスタンスを修正する必要があります-ケースバイケース。しかし、多分私より賢い誰かがこれを理解しました。
「いったいなぜそんなことをしたいのか」と自問しているのなら、読み続けてください。
バックグラウンド
私は、Reflectionを使用して、使用されている関数とクラスに関する特定の情報を集約するツールに取り組んでいます。スクリプトの引数の1つは、自動ロードでReflectionの信頼性を高めるためのオプションのブートストラップファイルです(ReflectionExceptions
特定のファイルではクラスが不明であるため、キャッチされてフォールバックヒューリスティックがトリガーされることはありません)。
これで、ブートストラップはオートローダーを正常にロードし、スクリプトは意図したとおりに実行され、問題が発生するまで、何百ものファイルを文句なしに移動します。
PHPの致命的なエラー:62行目の/usr/share/php/PHPUnit/Framework/Constraint.phpでクラスPHPUnit_Framework_Constraintを再宣言できません
私には2つの問題があります:
1つは、何がこれを引き起こしているのかわかりません。使用するブートストラップを調整しましたが、使用するインクルードパスに応じて、「再宣言できません」と「ファイルを開けませんでした」が交互に表示されます。妥協点はありません。つまり、エラーが発生しないポイントはありません。それでも、私はまだ調査中です。(ただし、この問題は質問の内容ではありません。)
2つ、さらに重要なことに、この質問の主題につながるので、私はそれを捕まえる方法が必要です。カスタムエラーハンドラを作成しようとしましたが、sに対しては機能したくないようですFatal error
(ある程度賢明なことに、議論の余地があるかもしれません)。
私はこのツールをいつかオープンソースの世界にリリースするつもりですが、これは非常に容認できない振る舞いとして私を襲います。存在しないクラスのフォールバックヒューリスティックがあります-ヒューリスティックを過度に使用せずに、一度はあまり頻繁に宣言されるのではなく、一度宣言されることをお勧めします。つまり、ブートストラッパーを使用する機能。スクリプトを壊すことなく。これまで。オートローダーの歴史の中で最悪のオートローダーだとしても。
(強調するために:オートローダーの助けは必要ありません。それはこの質問の内容ではありません。)