使用字符串创建PHP类实例到Symfony2

oli*_*007 1 php inheritance symfony

我需要将不同的对象实例化为同一个方法.我在这里找到了解决方案:

使用字符串创建PHP类实例

但是当我在Controller of 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
            )
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

抱歉我的英语,我正在学习它.

Mik*_*ikO 5

试试这个:

foreach ($files as $file) {
    $class = 'DIVE\FileUploaderBundle\Form\' . $fileType . 'Type';
    // ...
}
Run Code Online (Sandbox Code Playgroud)

实际上,你可以在你所关联的问题的最后评论中找到答案:

请注意,使用命名空间时,您必须提供完整路径:$className = '\Foo\Bar\MyClass'; $instance = new $className();- Giel Berkers 2014年 12月16日8:23

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