动态加载类无法解决命名空间/使用问题

时间:2013-03-22 18:22:46

标签: php namespaces

我注意到当我使用命名空间时,动态加载类与我静态加载它们时的工作方式不同。因此,例如,在不使用名称空间的情况下,以下内容在实例化名为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'在使用静态方法实例化时有效。有没有办法让它适用于两者?

P.S。我正在为所有类使用自动加载器......但我假设问题发生在之前自动加载器并且正在影响传递给自动加载器的类字符串。

3 个答案:

答案 0 :(得分:12)

我认为这是阅读文档的一个案例。见例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!
?>

答案 1 :(得分:4)

这是我能找到的最近的解决方案:

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;

<强>文档

答案 2 :(得分:0)

以下内容将 $ barfoo 动态实例化为 Structure \ Library \ UserService 对象:

namespace Structure\Library;

$classname = __NAMESPACE__ . "\\" . "UserService";
$barfoo = new $classname;