Php 类的动态加载可以';t地址名称空间/使用

Php 类的动态加载可以';t地址名称空间/使用,php,namespaces,Php,Namespaces,我注意到,当我使用名称空间时,动态加载类与静态加载类的效果不同。因此,例如,在不使用名称空间的情况下,以下内容在实例化名为FooBar的类的操作中是等效的: $foobar = new FooBar(); 及 但是,如果在使用名称空间时,我有如下代码: <?php namespace Structure\Library; $foobar = new UserService(); $classname = "UserService"; $barfoo = new $classname;

我注意到,当我使用名称空间时,动态加载类与静态加载类的效果不同。因此,例如,在不使用名称空间的情况下,以下内容在实例化名为
FooBar
的类的操作中是等效的:

$foobar = new FooBar();

但是,如果在使用名称空间时,我有如下代码:

<?php

namespace Structure\Library;

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

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

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

$foobar = new UserService();
$classname = __NSNAME__."UserService";
$barfoo = new $classname;
祝你好运

更新1

这可能有助于进一步阅读:

更新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;
文档


我认为这是一个阅读文档的案例。参见示例3:

似乎证实了我先前的评论

<?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!
?>

以下动态实例化$barfoo结构\Library\UserService对象:

namespace Structure\Library;

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

困惑于“它只在用静态方法实例化时才起作用”。您在哪里使用静态的
?理解问题?不,对不起,我指的是对类的静态引用,而不是“静态类”。:^)明确地说,
$foobar=newuserservice()的行你能告诉我们你的自动加载器的逻辑吗?我设想在其中,您使用名称空间来计算从中加载类文件的路径。是这样吗?难道你不能从自动加载器内部回显你的
$class
名字,给我们一个更好的线索吗?正如Allender所回答的,我认为正在处理的类名在一个实例化中包含名称空间,但在另一个实例化中不包含名称空间。本质上,代码的最后一行类似于编写:
$barfoo=new\UserService(),失败,因为该类不在全局命名空间中。另请参阅:我尝试使用您建议的使用语法,但它似乎对动态类加载没有帮助(对静态类没有帮助)。您阅读了链接吗?如果您链接了另一个类的位置(使用),那么您应该能够做到:
$obj=new-other,在您的案例中,
$barfoo=newuserservice。当然,我上面的示例(my\Full)需要替换为类所在的路径。是的,但是动态实例化类时,
use
操作符似乎不会被计算。我经常使用
use
,在这种情况下,我明确地尝试了它,但没有任何效果。从许多方面来说,在这种情况下,您可能并不真正希望使用
use
,尽管我试图创建一个动态响应,而use语句是静态的。无论如何,它不起作用我很抱歉听到ken:(.我会尝试做更多的研究。如果我发现任何有用的东西,我会将其添加到此线程。我已经添加了第二个更新ken。我希望它能帮助您(可能还有其他人)在头脑风暴中更接近一个统一的解决方案。谢谢@cartbeforehorse,我将在几周后研究这个问题。很抱歉我没有回答,但这个问题是6个月前提出的,在间隙中的某个地方,我一切都做得很好。也就是说,我仍然觉得我需要巩固我的理解。@ken我将这些问题填入我的own未来的参考资料,以及你的信息。我不希望得到回复,我想象你的工作会在接下来的6个月里有很大的进展。@ken实际上,这个回复是(技术上的)几乎与Allendar完全相同。但是,我发现该回复的格式不必要地难以遵循。好吧,php不支持这样的情况是不可能的,无论如何也不好:-(@nikoss仅仅因为你的代码是无用的,并不意味着我的是!
$c=“\\Carbon\\Carbon”$x=new$c();dd($x)
工作正常。不管出于什么原因,尽管你不能做
$x=new“\\Carbon\\Carbon”(;
)。我不知道技术原因是什么,但世界就是这样。
<?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!
?>
namespace Structure\Library;

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