【发布时间】:2017-02-17 06:33:53
【问题描述】:
我在这个问题上挣扎了一段时间 - 原因可能是微不足道的。
背景
我为我的 Yii2 应用程序创建了解析器模块,这样我就可以从其他地方(移动应用程序等)调用它来从各种网站获取数据。可能有很多解析器类,都实现了相同的接口。
项目结构
...
/modules
\_ parser
\_components
\_parsers
\_SampleParser.php
\_controllers
\_DefaultController.php
\_Parser.php
...
为了更好的可读性,我删除了一些代码。
DefaultController.php:
namespace app\modules\parser\controllers;
use Yii;
use yii\web\Controller;
use app\modules\parser\components\parsers;
use app\modules\parser\components\parsers\SampleParser;
/**
* Default controller for the `parser` module
*/
class DefaultController extends Controller
{
private function loadParser($parserName){
return new SampleParser(); // if I leave this here, everything works okay
$className = $parserName.'Parser';
$object = new $className();
if ($object instanceof IParseProvider){
return $object;
}
}
...
public function actionIndex()
{
$url = "http://google.com";
$parser = 'Sample';
$loadedParser = $this->loadParser($parser);
$response = $loadedParser->parse($url);
\Yii::$app->response->format = 'json';
return $response->toJson();
}
...
SampleParser.php:
<?php
namespace app\modules\parser\components\parsers;
use app\modules\parser\models\IParseProvider;
class SampleParser implements IParseProvider {
public function canParse($url){
}
public function parse($url){
}
}
现在一切正常,所以我想我正在导入正确的命名空间。但是当我删除 return new SampleParser(); 并让对象由字符串名称创建时,它会失败并出现错误:
PHP 致命错误 – yii\base\ErrorException
找不到类“SampleParser”
高亮行:
$object = new $className();
我在这里做错了什么?谢谢!
【问题讨论】: