使用Composer安装Omnipay库时出现问题


Trouble installing Omnipay library with Composer

我正在尝试将Omnipay API与Pin网关一起使用,但遇到了问题。

我已经在composer.json文件中本地运行了composer.phar:

   {
    "require": {
        "omnipay/omnipay": "~2.0"
    }
    }

composer"vendor"文件夹现在位于我的网站上的"classes/libs/vvendor"中。

我有这个付款类别:

class Payment extends BasicClass {
    public function charge() {
        require "libs/vendor/autoload.php";
        use Omnipay'Omnipay;
        $gateway = GatewayFactory::create('Pin');
        $gateway->setSecretKey($this->config->secretKey);
    }
}

呼叫时:

$topup = new Payment();
$topup->charge();

我得到一个解析错误,PHP对我的use Omnipay'Omnipay行有问题。

非常困惑,因为所有Omnipay文档似乎都使用了这种语法。

我尝试过类外的require和use行,但没有帮助。

感谢大家的帮助。

您必须在类定义之外使用use运算符。

来自PHP文档:

导入的范围规则

use关键字必须在文件的最外层范围(全局范围)或命名空间声明内声明。这是因为导入是在编译时而不是运行时完成的,因此不能块范围的。

http://php.net/manual/en/language.namespaces.importing.php#language.namespaces.importing.scope

您正在滥用Composer自动加载器。您应该将自动加载器作为每个请求中的第一个文件之一,可能是在加载任何配置文件或启动会话之前。

正如当前编码的那样,无论何时调用该charge方法,都会添加Composer自动加载器的另一个实例。在一个请求中调用charge三次(例如,当在一个循环中向三个客户计费时)将添加三个自动加载器。这听起来是个坏主意。

请参阅上的文档http://getcomposer.org/doc/01-basic-usage.md#autoloading以查看应该如何包含composer自动加载器。

特别要注意的是,如果您在Composer.json文件中定义了Composer,它也可以自动加载您自己的类。这真的是一个很好的功能,你再也不需要需要你即将使用的类了。