15

名前空間を使用している場合、クラスを動的にロードすると、静的にロードする場合と同じように機能しないことに気付きました。したがって、たとえば、名前空間を使用しない場合、次のものは、 というクラスをインスタンス化するアクションと同等ですFooBar

$foobar = new FooBar();

$classname = "FooBar";
$foobar = new $classname;

ただし、名前空間を使用する場合、次のようなコードがあります。

<?php

namespace Structure\Library;

$foobar = new UserService();
$classname = "UserService";
$barfoo = new $classname;

この場合、UserServiceクラスの完全修飾名はStructure\Library\UserServiceであり、完全修飾名を使用すると両方のケースで機能しますが、ショートカット名のみを使用すると、静的メソッドでインスタンス化された場合'UserService'のみ機能します。両方で動作させる方法はありますか?

PS私はすべてのクラスにオートローダーを使用しています...しかし、オートローダーの前に問題が発生しており、オートローダーに渡されるクラス文字列に影響を与えていると想定しています。

4

3 に答える 3

5

これは私が見つけることができる最も近い解決策です:

define('__NSNAME__', __NAMESPACE__.'\\');

$foobar = new UserService();
$classname = __NSNAME__."UserService";
$barfoo = new $classname;

幸運を!

更新 1

これは、さらに読むのに適しているかもしれません: http://www.php.net/manual/en/language.namespaces.importing.php

use My\Full\UserService as UserService;

更新 2

これは私が今どこまで来たかです:

namespace Structure\Library\Home;

class UserService {

}

namespace Structure\Library;

use Structure\Library\Home\UserService as UserService;

define('UserService', __NAMESPACE__.'\\Home\\UserService', TRUE);

$foobar = new UserService();
$classname = UserService;
$barfoo = new $classname;

または、柔軟性を高めるためのこのバリアント:

define('Home', __NAMESPACE__.'\\Home\\', TRUE);

$foobar = new UserService();
$classname = Home.'UserService';
$barfoo = new $classname;

ドキュメント

于 2013-03-22T18:32:28.800 に答える