问题 使用没有命名空间的类与Yii2


我想用 结帐SDK 使用Yii2但由于此库不支持PSR-4标准(名称空间),因此无法集成它。我如何将此库用于我的目的?

编辑

正如我所建议的那样,我试着用class作为

$sale = new \Twocheckout_Sale();

但我仍然无法使其发挥作用。


5268
2018-01-24 17:18


起源

什么是错误? - arogachev
找不到@arogachev类,当我尝试手动包含它时,它说无法重新声明它 - alwaysLearn
确保已安装扩展,并且文件存在于vendor文件夹中。 - arogachev
@arogachev我用composer使用'“2Checkout / 2checkout-php”安装了它:“@ stable”'在require部分下 - alwaysLearn
更新了答案,现在应该可以使用了。 - arogachev


答案:


当类没有命名空间时,它意味着它在根命名空间中。

选项1:

use Twocheckout;

...

Twocheckout::format('json');

选项2:

\Twocheckout::format('json');

例如, PHPExcel 扩展也没有名称空间,类似的问题得到了回答 官方论坛

相关问题:

将没有命名空间的类导入到命名空间类

如何使用php的“root”命名空间?

官方PHP文档:

http://php.net/manual/en/language.namespaces.fallback.php

更新:

PHPExcel 有自己的自动加载器,而 2Checkout 才不是。通过要求一个主要的抽象类来包含所有类。它甚至在官方提到 自述

require_once("/path/to/2checkout-php/lib/Twocheckout.php");

因此,您需要在使用库类之前手动包含它。它可以在别名的帮助下完成,以避免编写完整路径。

use Yii;
...
$path = Yii::getAlias("@vendor/2checkout/2checkout-php/lib/Twocheckout.php");
require_once($path);
$sale = new \Twocheckout_Sale();

要在一个地方使用它没关系,但如果它将在许多应用场所使用,最好在入口脚本中要求它 index.php

require(__DIR__ . '/../../vendor/autoload.php');

require(__DIR__ . '/../../vendor/2checkout/2checkout-php/lib/Twocheckout.php');

require(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php');
require(__DIR__ . '/../../common/config/bootstrap.php');
require(__DIR__ . '/../config/bootstrap.php');

我还建议阅读官方文档中的提示 使用下载的库,根据具体的库,您可以使用更多选项。


9
2018-01-24 17:57



谢谢,我会试一试,希望它有效:-) - alwaysLearn
请看编辑。我无法使它工作:( - alwaysLearn
它现在正在工作..谢谢:)) - alwaysLearn


/* Try this  */
public function actionTest(){
    //package
    require(Yii::getAlias('@vendor')."/Excel/Spreadsheet_Excel_Reader.php");

    $exldata = new \Spreadsheet_Excel_Reader();


}

0
2018-02-10 05:44