首页 > 解决方案 > 动态类加载 - 尝试从命名空间 _NAMESPACE_ 加载类 _CLASS_

问题描述

所以我尝试在 Symfony4 的服务中加载一个类。classname如果我将它加载为或加载它并不重要App\to\class\name\classname
它会产生相同的错误。

其他帖子说您需要添加整个完全限定的类名。
这不起作用。我错过了什么吗?下面的代码:

<?php
// src/Service/AdwordsService.php
namespace App\Service;

use App\Service\AdTypes\ExpendedTextAdTypes as ExpendedTextAdTypes;

class AdwordsService{ 
    ...
    public function getAdsModel($ad) //<-- for example "EXPANDED_TEXT_AD"
    {
        $type = explode('_',strtolower($ad->getType()));
        $modelName = array_map('ucfirst', $type);
        $modelName = implode('',$modelName).'Types';
        // will load ExpandedTextAdTypes
        return new $modelName($ad);
    }
    ...
}

它尝试加载的类:

<?php
// src/Service/AdTypes/ExpendedTextAdTypes.php
namespace App\Service\AdTypes;

class ExpendedTextAdTypes
{

    private $adData;

    public function __construct($ad)
    {
        $this->adData = $ad;
    }
}

标签: symfonysymfony4

解决方案


最终的问题是一个简单的错字:EXPANDED_TEXT_AD 与 EXPENDED_TEXT_AD 以及需要使用完全限定的类名:

// No need for any use statements
// use App\Service\AdTypes\ExpendedTextAdTypes as ExpendedTextAdTypes;

public function getAdsModel($ad) //<-- for example "EXPENDED_TEXT_AD"
{
    $type = explode('_',strtolower($ad));
    $modelName = array_map('ucfirst', $type);
    $modelName = implode('',$modelName).'Types';
    $modelName = 'App\\Service\\AdTypes\\' . $modelName; // Add this
    return new $modelName($ad);
}

通常,错字问题被认为是题外话。但是这个问题实际上有两个问题,以及指出不需要使用语句。所以我想它可以作为一个答案。

问题的标题也具有误导性。我点击了这个问题,因为我从未在错误消息中看到CLASS 。最好发布实际的错误消息,这样可以更容易地检测错字。

最后,一些不请自来的建议。这种从 EXPENDED_TEXT_AD 到 ExpendedTextAdTypes 的转换可能很难维护,并且肯定会将您锁定在类命名方案中。为什么不直接使用 ExpendedTextAd 而不是 EXPENDED_TEXT_AD?Symfony 一直在做这种事情。


推荐阅读