动态 class 加载 - 尝试从命名空间 _NAMESPACE_ 加载 class _CLASS_
dynamic class loading - Attempted to load class _CLASS_ from namespace _NAMESPACE_
所以我尝试在 Symfony4 的服务中加载 class。
我将它加载为 classname
还是 App\to\class\name\classname
.
并不重要
它会产生相同的错误。
其他帖子说您需要添加整个完全限定的 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);
}
...
}
Class 它试图加载:
<?php
// src/Service/AdTypes/ExpendedTextAdTypes.php
namespace App\Service\AdTypes;
class ExpendedTextAdTypes
{
private $adData;
public function __construct($ad)
{
$this->adData = $ad;
}
}
最终的问题是一个简单的错字:EXPANDED_TEXT_AD vs EXPENDED_TEXT_AD
以及需要使用完全限定的 class 名称:
// 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);
}
通常,typo questions are considered to be off-topic。但是这个题其实有两个问题,同时指出不需要use语句。所以我想它可以作为一个答案。
问题的标题也具有误导性。我点击了问题,因为我从未在错误消息中看到 CLASS。最好发布实际的错误消息,这样可以更容易地检测到打字错误。
最后,一些不请自来的建议。这种从 EXPENDED_TEXT_AD 到 ExpendedTextAdTypes 的转换可能难以维护,并且肯定会将您锁定在 class 命名方案中。为什么不直接使用 ExpendedTextAd 而不是 EXPENDED_TEXT_AD? Symfony 一直在做这种事情。
所以我尝试在 Symfony4 的服务中加载 class。
我将它加载为 classname
还是 App\to\class\name\classname
.
并不重要
它会产生相同的错误。
其他帖子说您需要添加整个完全限定的 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);
}
...
}
Class 它试图加载:
<?php
// src/Service/AdTypes/ExpendedTextAdTypes.php
namespace App\Service\AdTypes;
class ExpendedTextAdTypes
{
private $adData;
public function __construct($ad)
{
$this->adData = $ad;
}
}
最终的问题是一个简单的错字:EXPANDED_TEXT_AD vs EXPENDED_TEXT_AD 以及需要使用完全限定的 class 名称:
// 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);
}
通常,typo questions are considered to be off-topic。但是这个题其实有两个问题,同时指出不需要use语句。所以我想它可以作为一个答案。
问题的标题也具有误导性。我点击了问题,因为我从未在错误消息中看到 CLASS。最好发布实际的错误消息,这样可以更容易地检测到打字错误。
最后,一些不请自来的建议。这种从 EXPENDED_TEXT_AD 到 ExpendedTextAdTypes 的转换可能难以维护,并且肯定会将您锁定在 class 命名方案中。为什么不直接使用 ExpendedTextAd 而不是 EXPENDED_TEXT_AD? Symfony 一直在做这种事情。