我注意到,当我使用名称空间时,动态加载类不像静态加载类那样工作。因此,例如,在不使用名称空间的情况下,在实例化一个名为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'
的快捷方式名称,它只有在使用静态方法实例化时有效。有没有一种方法可以让它对两者都有效?
注:我使用自动装弹器所有类…但我假设问题发生在自动加载器之前,并影响传递给自动加载器的类字符串。
我认为这是阅读文档的一个例子。参见例3:
http://php.net/manual/en/language.namespaces.importing.php似乎证实了我之前的评论。
<?php
namespace foo'bar;
$classStr = "myClass";
$nsClass = "''foo''bar''myClass";
$x = new myClass; // instantiates foo'bar'myClass, because of declared namespace at top of file
$y = new $classStr; // instantiates 'myClass, ignoring declared namespace at top of file
$z = new $nsClass // instantiates foo'bar'myClass, because it's an absolute reference!
?>
这是我能找到的最接近的解决方案:
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;
文档
- http://www.php.net/manual/en/language.namespaces.importing.php
- http://www.php.net/manual/en/language.namespaces.faq.php language.namespaces.faq.globalclass
下面动态实例化$barfoo作为Structure'Library'UserService object:
namespace Structure'Library;
$classname = __NAMESPACE__ . "''" . "UserService";
$barfoo = new $classname;