在Symfony2中创建带有字符串的PHP类实例

在Symfony2中创建带有字符串的PHP类实例,php,symfony,inheritance,Php,Symfony,Inheritance,我需要将不同的对象实例化到同一个方法中。 我在这里找到了索卢斯: 但当我在Symfony2的控制器上使用时,我有一个错误: 试图从全局命名空间加载类PhotoType。 你忘了使用声明了吗 我不明白,因为我已经添加了我所有的用法 namespace DIVE\FileUploaderBundle\Controller; use DIVE\FileUploaderBundle\Entity\Photo; use DIVE\FileUploaderBundle\Form\PhotoType; ..

我需要将不同的对象实例化到同一个方法中。 我在这里找到了索卢斯:

但当我在Symfony2的控制器上使用时,我有一个错误:

试图从全局命名空间加载类PhotoType。 你忘了使用声明了吗

我不明白,因为我已经添加了我所有的用法

namespace DIVE\FileUploaderBundle\Controller;

use DIVE\FileUploaderBundle\Entity\Photo;
use DIVE\FileUploaderBundle\Form\PhotoType;
...

class DefaultController extends Controller {

    public function listFileAction($fileType) {
        $em = $this->getDoctrine()->getManager();
        $repository = $em->getRepository("FDMFileUploaderBundle:".$fileType);
        $files = $repository->findAll();

        $forms = array();
        foreach ($files as $file) {
            $class = $fileType."Type";
            array_push($forms, $this->get('form.factory')->create(new $class(), $file));
        }

        $formViews = array();
        foreach ($forms as $form) {
            array_push($formViews, $form->createView());
        }

        return $this->render("FDMFileUploaderBundle:Default:list".$fileType.".html.twig", array(
            "forms" => $formViews
            )
        );
    }
}
对不起,我在学英语。

试试这个:

foreach ($files as $file) {
    $class = 'DIVE\FileUploaderBundle\Form\' . $fileType . 'Type';
    // ...
}
事实上,你可以在你所链接的问题的公认答案中找到答案:

请注意,在使用名称空间时,必须提供完整路径:$className='\Foo\Bar\MyClass'$实例=新的$className;–2014年12月16日8:23

基本上,为了从字符串实例化类,必须使用类的完全限定名,包括名称空间。查看PHP手册中的页面以获得快速解释和示例。

尝试以下方法:

foreach ($files as $file) {
    $class = 'DIVE\FileUploaderBundle\Form\' . $fileType . 'Type';
    // ...
}
事实上,你可以在你所链接的问题的公认答案中找到答案:

请注意,在使用名称空间时,必须提供完整路径:$className='\Foo\Bar\MyClass'$实例=新的$className;–2014年12月16日8:23

基本上,为了从字符串实例化类,必须使用类的完全限定名,包括名称空间。查看PHP手册中的页面以获得快速解释和示例。

根据

必须使用带有名称空间前缀的完全限定名称类名。请注意,因为动态类名、函数名或常量名中的限定名和完全限定名之间没有区别,所以不需要前导反斜杠

必须使用带有名称空间前缀的完全限定名称类名。请注意,因为动态类名、函数名或常量名中的限定名和完全限定名之间没有区别,所以不需要前导反斜杠


如果我不得不猜测的话,我认为这是假设PhotoClass在全局名称空间中。从字符串调用类名时,请尝试将“DIVE\FileUploaderBundle\Form\”添加到类名中。如果必须猜测,我认为这是假设PhotoClass位于全局命名空间中。从字符串调用类名时,请尝试将“DIVE\FileUploaderBundle\Form\”添加到类名中。