Php 具有动态类名的工厂设计模式

Php 具有动态类名的工厂设计模式,php,design-patterns,namespaces,factory-pattern,Php,Design Patterns,Namespaces,Factory Pattern,我正在尝试创建一个工厂设计模式,它将生成具有动态类名的类 我的代码: namespace FOO; class MyFactory { public static function create($name) { return new \FOO\$name; } } 我得到一个解析语法错误(如netbeans所示)。这是可能的还是良好的做法? 谢谢 编辑: 分析错误:“在\expected identifier之后出现意外的变量名”要使用变量名实例化类,需要

我正在尝试创建一个工厂设计模式,它将生成具有动态类名的类

我的代码:

namespace FOO;

class MyFactory {
    public static function create($name) {
        return new \FOO\$name;
    }

}
我得到一个解析语法错误(如netbeans所示)。这是可能的还是良好的做法? 谢谢

编辑:
分析错误:“在\expected identifier之后出现意外的变量名”

要使用变量名实例化类,需要将整个名称(包括名称空间)放入变量中:

$name = "Foo\\$name"; // note: no leading backslash
return new $name;

语法错误可能是
returnnew\FOO\$name”
中的单双引号(不匹配…).不…抱歉,这是一个输入错误。现在已修复。为什么没有前导反斜杠?当然,类可以通过其完全限定名引用!相反:在上面的示例中,您的建议将导致类名为
\FOO\FOO\
…不,不会。变量类名始终是FQN。它们与当前命名空间无关,它们始终是艺术在顶部。这就像在
use Foo\Bar
语句中不使用前导反斜杠一样,它们也总是FQN。啊,谢谢,我必须尝试一下……听起来像是一个奇怪的逻辑,但它可能解释了我以前遇到的一些奇怪的效果;-)基本上,类的名称是
Foo\Bar
,所以既然你实例化了我使用您需要的变量按名称排序。前导反斜杠仅用于名称解析,此处不适用。:@Danny String类名称始终是完全限定的,不需要前导反斜杠。前导反斜杠用于表示“我不是在这个名称空间中谈论类,而是在另一个名称空间中。”“。由于完全限定名总是“在另一个命名空间中”,因此不需要/错误使用反斜杠。另见。