在 PHP 5.4 中替换 ::class

Replacing ::class in PHP 5.4

我正在使用 this Composer package 进行需要此包提供的功能的开发。在寻找替代方案时,我发现这是我最好的选择,因为可用的替代方案过于简单,无法在我处理的时间限制下实施。

现在,我已经在本地机器上测试了它 运行 PHP 5.5(在 Linux 子系统上 Windows 10), 个人服务器运行 PHP 5.6, 但是生产服务器是运行 PHP 5.4, 由于原因无法升级

首先我遇到了这个错误:

Parse error: syntax error, unexpected 'class' (t_class), expecting identifier (t_string) in …

寻找解决方案我点击了,所以我转到了包代码并找到了以下片段:

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 不兼容,并且在尝试执行 , I had the results .

现在,到目前为止,我已经评论了有问题的行(都是 array 包含这些 ::class 定义),在生产服务器上进行了测试,到目前为止可以正常工作。但我想知道这个 ::class 定义是否有实际的替代品。

重要说明:我在网上看到的例子中提到 get_class('ClassName') 指的是 ClassName::class,而不是 classMethod::class个案。我也 运行 进入 ,但答案中提供的示例并没有告诉我如何使用它。

您只需将数组值替换为 classes 的完全限定名称。 假设 class Example 有命名空间 foo\bar 而不是写 Example::class 只写 foo\bar\Example.

::class return class 的完整命名空间。您可以改为编写完整的名称空间。在一些新包中,最好将命名空间提供给 class 并在需要时在 class 中创建实例。 ::class 更短,也更舒适。

例如:

protected static $classmap = [
    'getTransactionResult' => 'Namespace\of\the\class',
]

这要长得多,当你在那个位置遇到这样的问题时,我相信你在使用新包时会遇到更多问题。