使用文件夹的所有类

时间:2018-05-10 14:43:52

标签: php symfony

我在Symfony 4中创建了一个服务,它使我能够恢复文件的每个类PHP的名称,并通过循环实例化每个类。

但我有这个错误,这是合乎逻辑的,因为我不会为每个班级使用“使用”:

  

尝试加载课程" MyClass"来自全局命名空间。难道   你忘记了"使用" " App \ Service \ Adapter \ MyClass"?

的声明

我希望我的文件中的每个文件都在我的服务中自动使用。这可能吗?

我的代码:

<?php

declare(strict_types = 1);

namespace App\Service\Factory;

use App\Service\Adapter\AdapterInterface;
use Doctrine\ORM\EntityManagerInterface;
use function dump;
use function explode;
use function scandir;

/**
 * Class ArticleFactory
 *
 * @package App\Service\Factory
 */
class ArticleFactory
{
    /**
     * @var EntityManagerInterface
     */
    protected $entityManager;
    protected $pathService;

    /**
     * ArticleFactory constructor.
     *
     * @param EntityManagerInterface $entityManager
     * @param $pathService
     */
    public function __construct(EntityManagerInterface $entityManager, $pathService)
    {
        $this->entityManager = $entityManager;
        $this->pathService = $pathService;
    }

    public function adapters(): void
    {
        $scandir = scandir($this->pathService . '/Adapter', SCANDIR_SORT_NONE);
        $adapters = [];

        foreach ($scandir as $key => $value) {
            if ($value !== '.' && $value !== '..' && $value !== 'AdapterAbstract.php' && $value !== 'AdapterInterface.php') {
                $cuttedString = explode('.php', $value);
                $className = $cuttedString[0];

                $adapters[] = new $className($this->entityManager);
            }
        }

        foreach ($adapters as $adapter) {
            if ($adapter instanceof AdapterInterface) {
                $adapter->rss();
                $article = $adapter->adapt();

                foreach ($article as $item) {
                    $this->entityManager->persist($item);
                }
            }
        }
        $this->entityManager->flush();
    }
}

我对此进行了测试,但它不起作用:

use App\Service\Adapter;

并且:

use App\Service\Adapter\*;

并且:

$className = '\\'.$cuttedString[0];
$adapters[] = new $className($this->entityManager);

1 个答案:

答案 0 :(得分:0)

如果文件(或类)不使用任何名称空间,那么它将放在全局名称空间中。您可以使用反斜杠()作为前缀来实例化这些类。例如:

$myClass = new \MyClass();
$datetime = new \DateTime();