类的动态加载不能'


Dynamic loading of classes can't address namespace/use

我注意到,当我使用名称空间时,动态加载类不像静态加载类那样工作。因此,例如,在不使用名称空间的情况下,在实例化一个名为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;