【问题标题】:Using classes without namespace with Yii2在 Yii2 中使用没有命名空间的类
【发布时间】:2017-02-10 13:44:41
【问题描述】:

我想将Checkout SDK 与 Yii2 一起使用,但由于该库不支持 PSR-4 标准(命名空间),我无法集成它。我怎样才能将这个库用于我的目的?

编辑

按照建议,我尝试使用 class as

$sale = new \Twocheckout_Sale();

但我仍然无法使其工作。

【问题讨论】:

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

标签: php namespaces yii2 2checkout psr-4


【解决方案1】:

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

选项 1:

use Twocheckout;

...

Twocheckout::format('json');

选项 2:

\Twocheckout::format('json');

例如,PHPExcel 扩展也没有命名空间,official forum 回答了类似的问题。

相关问题:

Importing class without namespace to namespaced class

How to use "root" namespace of php?

PHP 官方文档:

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

更新:

但是PHPExcel 有自己的自动加载器,而2Checkout 没有。通过需要一个主要的抽象类来包含所有类。官方readme也提到了:

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');

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

【讨论】:

  • 请看编辑。我无法让它工作:(
【解决方案2】:
/* Try this  */
public function actionTest(){
    //package
    require(Yii::getAlias('@vendor')."/Excel/Spreadsheet_Excel_Reader.php");

    $exldata = new \Spreadsheet_Excel_Reader();


}

【讨论】:

    猜你喜欢
    • 2013-12-28
    • 1970-01-01
    • 2020-07-20
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    相关资源
    最近更新 更多