2013-05-06 11 views
8

まず、これは少し長いですので、読んでいただきありがとうございます。PHP 5.4対5.3:同じファイルに複数のクラスをオートロードする

私の問題は、この1のようになります。 Class not found in the same file

私はもともとPHP 5のために2008年に書かれた特注のフレームワークを持っており、PHP 5.3で動作するように年間でアップグレードされています。私は5.4の互換性を見てきており、重大な問題にぶつかってきました。

ORMレイヤーは、各DBテーブルのクラスを自動的に生成します。これらのクラスはすべてテーブルごとに1つのファイルに格納され、必要に応じてオートローダがそのファイルをロードします。 たとえば、 'public'スキーマ(postgresql)の 'customer'テーブルには、次のクラスがあります。 PublicCustomer、PublicCustomerDBReader、PublicCustomerDBWriter。 これは理想的な設定ではないかもしれませんが、現在の状況です。

PHP 5.3では、PublicCustomerが必要な場合、ファイルが含まれ、解析され、上記のクラスがすべて利用可能になります。したがって、たとえば、静的メソッドがPublicCustomerで呼び出され、そのメソッドがPublicCustomerDBReaderで何かを呼び出すと、そのクラスは同じファイルに存在するため、正常に動作します。

PHP 5.4では、いくつかの最適化がコアで行われたようです。上記のシナリオで:

  1. 静的メソッドがPublicCustomerで呼び出されます。

  2. オートローダーは正しいファイルを見つけてロードします。

  3. PHPパーサは、必要なところでのみ解析します。 PublicCustomerクラス。 PublicCustomerDBReaderクラスを解析またはインスタンス化していません。私は、クラスが存在するかどうかをテストし、パーザがインクルード時にファイルの最後に到達したかどうか、メソッドが呼び出されたときにそれを知ることで確認できます。

  4. PublicCustomerのメソッドは、PublicCustomerDBReaderでメソッドを呼び出しようとします。これは、オートローダーが既にファイルを1回必要としているため失敗します。

それは私は2つのソリューションを持っているように私には思える:

  1. セパレートこれらのクラスアウトごとに1つのファイル(これは、ファイルの膨大な数を生成します)
  2. はORMを再設計しているように、複数のクラスを必要としないようにします。

私は上記の問題を適切に理解しましたか?

この動作の原因となる最適化や変更がPHP 5.4で行われたことを知っている人はいますか?

私が考慮していない問題の解決策は他にありますか?

+2

あなたは方法1と一緒に行くべきです。いくつのクラスがありますか?それは多くの仕事ではありません。 PHPオートローダーは、クラス名\名前空間に関連するファイル名\ディレクトリに基づいています。 PHPには、組み込みのパッケージサポートはありません。とにかくスクリプトをよりモジュラーにする必要があります。 class2だけが必要な場合、アプリケーションがclass1とclass2を解析する必要があるのはなぜですか? – mpm

+0

クラスごとに別々のファイルを作成する方法でORMを変更できないことはありますか?これは簡単に問題を解決し、とにかく良いでしょう。 ;) –

+0

クラスを別々のファイルに分けることはできますが、明らかにORMのファイル数が増えます。実際にはDBテーブルごとに5つのクラスがあるため、ファイル数は5倍になります。私が管理しているデータベースには、300〜400のテーブルがあります。これは〜2000個のファイルを意味します。 明らかにそれは素晴らしいデザインではありません、私はそれを前進させるための最善の方法を考えています。 – user2353938

答えて

1

ファイルの先頭にリーダー/ライタークラスを配置します。また、パーサはエラー時にのみ停止する必要があるため、バグレポートを提出することを検討することもできます。

0

PHP Framework Interop Groupとそのオートロード標準PSR-0PSR-4を参照すると、各クラスには末尾に.phpという名前のファイルが必要です。何千ものクラスがあっても、これはファイルシステムにとって問題ではありません。

ファイルに複数のクラスを使用すると、以下の側面を考慮しなければなりません:オートローダーをロードするファイルを決定する必要があり、各クラスのために

  • 。ファイル内に複数のクラスがある場合は、使用される各クラスによって負荷が発生します。クラスファイルは再宣言できないため、クラスファイルは1回以上ロードする必要があります。私はそれをお勧めしませんが、ロードされたファイルやロードされたクラスのテストを覚えているあなた自身のオートローダーでこれを処理できます。
  • 同じファイル内に配置され、お互いを使用するクラスは問題があります。この問題は、Derived class defined later in the same file “does not exist”?answered by Jonに記述されています。
関連する問題