6

もちろん、同じ名前空間とクラス名を持つ同じサードパーティ ライブラリ (またはクラス) の異なるバージョンがある場合。名前の衝突を避けて同じプロジェクトに含める方法はありますか?

この問題の別のケースは、コンポーネントが個別に開発されるモジュラー プロジェクトがある場合に発生します。したがって、独自のフォルダーに同じ外部ライブラリ ファイルを含むさまざまなモジュールを含めることができますが、もちろん、モジュールが読み込まれると、クラスの衝突が発生します。

この記事で 同じクラスの複数のバージョンをロードする

ユーザーはこのコードを使用することを提案します:

namespace old {
   include /lib/api-1.0/library.php;
}
namespace foo {
   include /lib/api-2.0/library.php;
}

$oldlibary = new old\Library();
$newlibrary = new foo\Library();

しかし、もちろんうまくいきません。いずれにせよ、クラスは var ではなくグローバルに宣言されているため、衝突します。

だから..含めるライブラリのすべての名前空間を手動で編集しない別のソリューションはありますか?

前もって感謝します

4

1 に答える 1

3

これは、モジュラー システムでは非常に一般的な問題です。PHP では、非常に悪いハック (eval、file_get_contents、str_replace) で解決しようとすることもできますが、多くの便利なツール サポート (バックトレース、デバッグ、op コード キャッシュ、正確なエラー レポートなど) を失うことになります。

これらの問題にアプローチする通常の方法は、ある種の依存関係管理を使用することです。たとえば、Java では maven がほとんどの場合に使用され、scala では maven または sbt が使用され、php の人は通常composerを使用します(これを使用したことがないため、それが良いかどうか、必要なものをサポートするかどうかさえ完全にはわかりません) )。

これらのツールには通常、典型的なバージョンの競合を検出して解決するためのアルゴリズムが組み込まれています。ただし、これは競合する 2 つのバージョンに互換性がある (または少なくとも使用している部分に互換性がある) 場合にのみ機能します。提供されたバージョンの 1 つを選択するか、中間のバージョンを選択するか (非常に奇妙な場合もあります)、使用するバージョンを決定します。しかしもちろん、同じ名前空間内で両方のバージョンが確実に必要になるという問題も解決できません。

一般的に言うと、最も簡単な方法は、会社全体または少なくともアプリケーション全体で常に同じライブラリまたはモジュール バージョンを使用することです。上記のツールはそれを支援します。

申し訳ありませんが、あなたの具体的な問題の助けにはなりませんが、提供されたキーワードのいくつかがあなたに役立つことを願っています.

于 2013-07-13T11:22:06.410 に答える