1

私はCMSのプラグインシステムに取り組んでいます。CMS内では名前空間をよく使用しています。プラグインの開発者は、プラグイン内で名前空間を使用する必要がないということです。これは、以前に名前空間を使用したことがない開発者にとっては非常に複雑になる可能性があるためです。名前空間の主な問題は、登録できるイベントです。現在、プラグイン開発者は、を使用してEventクラスをロードする必要があります。クラスをインポートするだけでは、名前空間を使用しているため、use \events\Event;引き続き使用できません。new Event();私が欲しいのは、彼らがただ使うことができるということですnew Event();(クラス自体はCMSのオートローダーによって自動ロードされるので、インクルードは必要ありません)。

したがって、基本的に、特定のクラスまたはファイルで名前空間を無効にしたいのです。したがって、クラスからを削除せずに、のnew \events\Event();ようになります。new Event();namespace events;Event

私はそれを明確に説明したと思います、私はこの種のものを説明するのが得意ではありません。

4

3 に答える 3

2

いいえ。言い換えると、これは機能しません。

namespace Foo {
    class Event {}
    include('plugin.php');   // plugin.php cannot just do new Event();
}

CMSのプラグイン開発ドキュメントは名前空間の使用法について明確である必要があり、プラグイン開発者は単に次のようなものを書く必要があるため、これは実際には問題にはなりません。

use Plugin\Namespace\Events\MyEventType;

MyEventType資格を与える必要なしに参照する。確かに、プラグインの作者に尋ねるのはそれほど多くありませんか?

于 2013-02-24T22:07:22.787 に答える
1

完全に理解しているかどうかはわかりませんが、「グローバル」名前空間でコードを実行するには、次のようにします。

namespace {
    // this runs in global namespace
}

参照:同じファイルでの複数の名前空間の定義

于 2013-02-24T22:04:26.277 に答える
1

AFAIKは不可能ですが、プラグインの作成者がクラスを含めることがloader::load('someclass');できるように必要なファイルを含むローダーを使用する場合、ローダーに名前空間を含む完全なクラス名を返させ、プラグインがそれを使用できるようにすることができます。

$em_classname = Loader::load('eventmanager');
//dymamic use
$em = new $em_classname;
$em->registerEvent();
//static use
$em_classname::registerEvent();

動的に使用する場合は、クラス名の代わりにクラスのインスタンスを返すこともできます。

于 2013-02-24T22:16:13.760 に答える