шаблон проектирования фабрики с именем динамического класса

Я пытаюсь создать фабричный шаблон проектирования, который будет генерировать классы с динамическим именем класса.

мой код:

namespace FOO;

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

}

Я получаю синтаксическую ошибку синтаксического анализа (как указано в netbeans). это возможно или это хорошая практика? Благодарность

РЕДАКТИРОВАТЬ: ошибка анализа: «неожиданное имя переменной после \ ожидаемого идентификатора»


person Danny Valariola    schedule 10.12.2013    source источник
comment
Что ж, синтаксическая ошибка, вероятно, связана с одинарной двойной кавычкой в ​​return new \FOO\$name"; (нет совпадения ...).   -  person arkascha    schedule 10.12.2013
comment
нет ... извините, это опечатка. исправлено сейчас.   -  person Danny Valariola    schedule 10.12.2013


Ответы (1)


Чтобы создать экземпляры классов с именем переменной, вам нужно поместить в переменную все имя, включая пространство имен:

$name = "Foo\\$name"; // note: no leading backslash
return new $name;
person deceze♦    schedule 10.12.2013
comment
Почему нет обратной косой черты в начале? Конечно, на класс можно ссылаться по его полному имени! Напротив: в приведенном выше примере ваше предложение приведет к имени класса \FOO\FOO\<name> ... - person arkascha; 10.12.2013
comment
Нет, не будет. Имена классов переменных всегда FQN. Они не относятся к текущему пространству имен, они всегда начинаются сверху. Это то же самое, что не использовать начальную обратную косую черту в операторах use Foo\Bar, они также всегда FQN. - person deceze♦; 10.12.2013
comment
Ах, спасибо, я должен попробовать это ... Звучит странно, но это может объяснить некоторые странные эффекты, с которыми я сталкивался раньше ;-) - person arkascha; 10.12.2013
comment
По сути, name класса - Foo\Bar, поэтому, поскольку вы создаете его по имени, используя переменную, которая вам нужна. Начальная обратная косая черта предназначена только для разрешения имен, что здесь не применяется. :) - person deceze♦; 10.12.2013
comment
@arkascha woriking отлично ....! но я не совсем понял проблему обратной косой черты ... не могли бы вы уточнить? (я спрашиваю, потому что добавление обратной косой черты тоже сработало) - person Danny Valariola; 10.12.2013
comment
@Danny String имена классов всегда полностью уточняются и не требуют начального обратного слэша. Начальная обратная косая черта означает, что я говорю не о классе в этом пространстве имен, а в другом пространстве имен. Поскольку полностью определенные имена всегда находятся в другом пространстве имен, обратная косая черта не нужна / неверна. Также см. stackoverflow.com/questions/16808044/. - person deceze♦; 10.12.2013