既存のコードを壊すことなく、PHPネームスペースをライブラリに部分的に追加するにはどうすればよいですか?


10

私の会社では、PHP 5.3が名前空間を追加するずっと前から、モジュラーPHPフレームワークを何年にもわたって作成してきました。最近、ライブラリの新しいコードで名前空間の使用を開始することを決定し、最終的に古いコードの名前空間を作成する予定です。ただし、v5.3より前のコードベースに名前空間を追加するのが良い考えではないかどうかを判断するために考えているいくつかの問題があります。

  1. クラスに名前空間を\付けるだけでなく、グローバル名前空間をインポート(使用)して、すべてのグローバルクラスにプレフィックスが必要ないようにすることはできますか?
  2. ライブラリ内の既存のクラスに名前空間を付ける場合、フレームワークのアップグレードと同時にすべての既存のプロジェクトが壊れないようにするにはどうすればよいですか?たとえば、できるクラスの名前は、ライブラリーの変化ThemeEngineする\module\theme\ThemeEngineが、既存のウェブサイトを呼び出すThemeEngineことなく、任意のコード変更?もしそうなら、そのコードはどのように見えるでしょうか?

回答:


2
  1. 名前空間を「使用」することはできませんが、残念ながら次のクラスのみです:http : //www.php.net/manual/en/language.namespaces.importing.php。編集:いずれかの例のArrayObjectで行ったように、グローバル名前空間からクラスをインポートできます。

  2. グローバル名前空間にある既存のすべてのクラスが理論的にはクラスを適切に検出できるように、useステートメントのグローバルセクションを持つことができます。理論的には...

私たちはあなたと同じ船に乗っています。名前空間を使用しない古いコードがいくつかありますが、_名前空間フェイカー(Zend_Db_Table ...など)を使用しており、名前空間を偽造しない古いコードもあります。おそらく同じルートを取るでしょうが、それが可能かどうかをテストする必要があります。幸運を!


1

結局私がやったことは使用でした-必要な個々のクラスをインポートするための「使用」

たとえば、次のようなすべての前に「/」を追加する代わりに:

\DateTime()

名前空間の下に追加しました

namespace MyProject;
use DateTime;

...
DateTime();     //without \
...
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.