2011-02-09 22 views
0

私は、この中のZend Frameworkのライブラリを使用していますし、それは私がロード複数のバージョン

realpath(CENTRAL_LIBS_PATH . '/ZendFramework-1.10.8/library'), // /Zend left out

index.phpの中でそれを読み込むパス

ZendFramework-1.10.8/library/Zend/

を持っています

とそのクラスクラスの1つを呼び出すことができますZend_Form_

今私の質問には、同じライブラリの複数のバージョン。私はindex.phpの中

realpath(CENTRAL_LIBS_PATH . '/ZendFramework-1.10.8/library'), 
realpath(CENTRAL_LIBS_PATH . '/ZendFramework-2.0.0/library') 

の両方をロードするだろうが、私はZend_Formのようなクラスを呼び出すときに、どのように私は明示的にv1.10.8から1またはV2.0.0からいずれかを使用することを教えてくださいと仮定します?私は、2つの図書館が同じクラスを持っていれば、上記の図書館が呼び出されたということをどこかに読んで覚えています。しかし、どうすれば2の意志で切り替えることができますか?それは同じプロジェクトで行うことができますか?

+3

同じスクリプト内から同じライブラリの複数のバージョンを使用する特別な理由はありますか? –

+3

結論:これは完全に不可能ではありませんが、それは醜いコードの地獄へのハイウェイです。 – Mchl

+0

@Mchiのように、それは可能かもしれないが、私はそれをやらなければならないことを避けるために可能な限りすべてをやります。それは起こるのを待っている悪夢のように聞こえる。 @マーク・ベイカーのように質問:なぜあなたはそれをしたいのですか?それを避ける方法があるかもしれません。 –

答えて

2

Zend Framework 2クラスは名前空間内にグループ化され、ディレクトリを参照する独自のオートローダーを持っています(ディレクトリと名前空間の1:1の関係にする必要があります)。

複数のオートローダーを登録できるように、オートローダーを登録する必要があります(複数のオートローダーを登録できるように、ZF 1.10を書き直す必要があるかもしれません。 Zend_Formをロードしようとしますが、ZF2はZend \ Formをロードしようとします。私はおそらくZF1オートローダーを修正して、本当のPHP名前空間を使用しているリクエストを無視するでしょう。クラスを探す方法を教えてください。ほとんどの場合、ZF2クラスを使用する場合は、オートローダを最初に登録し、ZF1を2番目に登録する必要があります。

+1

このソリューションはおそらく動作しますが、これを行うことはお勧めしません。ネームスペースを使用するフレームワークと、頭痛に冒されるネームスペースを使用しないフレームワークとの間には、このような切断があります。 –

+0

ライブラリがオートローダーを持たない場合は、一般的に他のライブラリでどのように動作しますか?私はこれを可能な限り単純な言葉で理解しようとしています。上記のように、フォルダ階層のクラスの束であり、2つの異なるバージョンがロードされるライブラリです。私はZendプロジェクトに、他のクラスからクラスをロードするように指示します(私たちはもはや2つのZendバージョンについては話しません。一般的にライブラリの2つのバージョンのみ) – jblue

+0

あなた自身のオートローダーまたはデフォルトローダーを置き換えるインポートメソッドの一種。 PHPドキュメントのspl_autoload_registerを見てください。これにより、複数のオートロードメソッドを順番に呼び出すことができます。任意の数のローダーを作成することができますので、理論上、必要なフレームワーク用のオートローダーを使用できますが、実際にはクラスをロードしようとするたびにパフォーマンス問題になります。PHPは登録した各オートローダーを反復し、適切なファイルを探します。 –

関連する問題