【发布时间】:2017-01-08 14:01:03
【问题描述】:
我正在使用this Composer package 进行需要此包提供的功能的开发。寻找替代方案时,我发现这是我最好的选择,因为可用的替代方案太简单了,无法在我正在处理的时间限制内实施。
现在,我已经在运行 PHP 5.5 的本地机器(在 Windows 10 的 Linux 子系统上)、运行 PHP 5.6 的个人服务器上测试了它,但生产服务器运行的是 PHP 5.4,由于某些原因无法升级。
首先我遇到了这个错误:
Parse error: syntax error, unexpected 'class' (t_class), expecting identifier (t_string) in …
寻找解决方案我打了this question,于是去包代码,发现如下sn-p:
protected static $classmap = [
'getTransactionResult' => getTransactionResult::class,
'getTransactionResultResponse' => getTransactionResultResponse::class,
'transactionResultOutput' => transactionResultOutput::class,
'cardDetail' => cardDetail::class,
'wsTransactionDetailOutput' => wsTransactionDetailOutput::class,
'wsTransactionDetail' => wsTransactionDetail::class,
'acknowledgeTransaction' => acknowledgeTransaction::class,
'acknowledgeTransactionResponse' => acknowledgeTransactionResponse::class,
'initTransaction' => initTransaction::class,
'wsInitTransactionInput' => wsInitTransactionInput::class,
'wpmDetailInput' => wpmDetailInput::class,
'initTransactionResponse' => initTransactionResponse::class,
'wsInitTransactionOutput' => wsInitTransactionOutput::class
];
我发现 ::class 定义与 PHP 5.4 不兼容,在尝试执行 what the answer to the question suggested 时,我得到了结果 in this commentary to that answer。
现在,到目前为止,我已经评论了有问题的行(两者都是 arrays 包含这些 ::class 定义),在生产服务器上进行了测试,并且工作至今。但我想知道这个 ::class 定义是否有实际替代品。
重要提示:我在网上看到的例子是关于get_class('ClassName') 指的是ClassName::class,而不是classMethod::class 案例。我也遇到过this question,但答案中提供的示例并没有让我知道如何使用它。
【问题讨论】:
-
PHP 5.4 已在将近一年前终止。现在在生产环境中运行非常不安全。 升级。 php.net/eol.php
-
您使用的是unsupported End-Of-Life version of PHP。不幸的是,这意味着您缺乏支持。解决问题的最佳方法是升级 PHP 或使用支持 PHP 5.4 的库。真的没有什么除了告诉你之外,这里的任何人都可以为你做。
-
@ceejayoz 感谢您的及时建议,但这是我和系统管理员已经知道的。到目前为止,作为开发人员,我对此无能为力,因为它是一个运行太多遗留脚本的遗留服务器。有一个新的生产服务器的计划,但它不在近期的计划中。
-
我想指出 PHP 5.4 仍然是 RHEL/CentOS 提供的主要版本,他们正在向后移植安全补丁并维护他们的版本。我很惊讶人们以“安全性”为由盲目地建议迁移到供应商未维护的版本。这实际上恰恰相反,像 RedHat 这样的供应商有预算和团队来确保安全补丁被反向移植,而大多数 3rd 方存储库只是构建最新版本,并没有评估或解决安全风险。跨度>
标签: php composer-php php-5.4