web-dev-qa-db-ja.com

既存のコードを壊すことなくPHP名前空間をライブラリに部分的に追加するにはどうすればよいですか?

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

  1. クラスに名前空間を付けるだけでなく、グローバル名前空間をインポート(使用)して、すべてのグローバルクラスに\プレフィックスを付ける必要がないようにすることはできますか?
  2. ライブラリ内の既存のクラスに名前空間を付ける場合、フレームワークのアップグレード直後に既存のすべてのプロジェクトが壊れないようにするにはどうすればよいですか?たとえば、ライブラリはクラスThemeEngineの名前を\module\theme\ThemeEngineに変更できますが、既存のWebサイトはanyコードを変更せずにThemeEngineを呼び出しますか?もしそうなら、そのコードはどのように見えるでしょうか?
10
jimp
  1. 名前空間をまったく「使用」することはできません。悲しいことに、クラスのみ http://www.php.net/manual/en/language.namespaces.importing.php です。編集:いずれかの例のArrayObjectで行ったように、グローバル名前空間からクラスをインポートできます。

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

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

2
Pelshoff

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

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

\DateTime()

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

namespace MyProject;
use DateTime;

...
DateTime();     //without \
...
1
Stevanicus