【问题标题】:Creating PHP class instance with a string into Symfony2在 Symfony2 中创建带有字符串的 PHP 类实例
【发布时间】:2015-04-07 18:20:43
【问题描述】:

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

Creating PHP class instance with a string

但是当我在 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
            )
        );
    }
}

对不起我的英语,我正在学习它。

【问题讨论】:

  • 如果我不得不猜测我认为它假设 PhotoClass 在全局命名空间中。从字符串调用类名时,尝试将 'DIVE\FileUploaderBundle\Form\' 添加到类名中。

标签: php symfony inheritance


【解决方案1】:

试试这个:

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

实际上,您可以在 last comment 中找到您所链接的问题的已接受答案的答案:

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

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

【讨论】:

    【解决方案2】:

    根据http://php.net/manual/en/language.namespaces.dynamic.php

    必须使用完全限定名(带有命名空间前缀的类名)。请注意,由于动态类名、函数名或常量名中的限定名和完全限定名没有区别,因此不需要前导反斜杠。

    【讨论】:

      猜你喜欢
      • 2011-06-02
      • 1970-01-01
      • 2013-02-02
      • 2020-07-30
      • 1970-01-01
      • 2015-07-22
      • 1970-01-01
      相关资源
      最近更新 更多