在PHP 5.4中替换::class
在PHP 5.4中替换::class
我正在使用这个Composer包进行开发,因为我的开发任务需要这个包提供的功能。在寻找替代方案时,我发现这是我最好的选择,因为其他可用的替代方案都太简陋,无法在我所面临的时间限制内实施。\n现在,我已经在运行PHP 5.5的本地机器(在Windows 10的Linux子系统上)和运行PHP 5.6的个人服务器上进行了测试,但是生产服务器正在运行PHP 5.4,由于某些原因无法升级。\n首先,我遇到了这个错误:\n解析错误:syntax error, unexpected \'class\' (t_class), expecting identifier (t_string) in …\n寻找解决方案时,我看到了这个问题,所以我查看了包的代码,并找到了以下代码片段:\nprotected static $classmap = [\n \'getTransactionResult\' => getTransactionResult::class,\n \'getTransactionResultResponse\' => getTransactionResultResponse::class,\n \'transactionResultOutput\' => transactionResultOutput::class,\n \'cardDetail\' => cardDetail::class,\n \'wsTransactionDetailOutput\' => wsTransactionDetailOutput::class,\n \'wsTransactionDetail\' => wsTransactionDetail::class,\n \'acknowledgeTransaction\' => acknowledgeTransaction::class,\n \'acknowledgeTransactionResponse\' => acknowledgeTransactionResponse::class,\n \'initTransaction\' => initTransaction::class,\n \'wsInitTransactionInput\' => wsInitTransactionInput::class,\n \'wpmDetailInput\' => wpmDetailInput::class,\n \'initTransactionResponse\' => initTransactionResponse::class,\n \'wsInitTransactionOutput\' => wsInitTransactionOutput::class\n];\n我发现这个::class的定义与PHP 5.4不兼容,并且在尝试按照问题的答案所建议的方法进行操作时,我得到了这个评论中的结果。\n到目前为止,我已经注释掉了出现问题的行(都是包含这些::class定义的数组),在生产服务器上进行了测试,目前工作正常。但是我想知道是否有实际的替代方法来代替这个::class定义。\n重要提示:我在网上看到的示例都是关于get_class(\'ClassName\')指的是ClassName::class,但没有关于classMethod::class的案例。我也遇到了这个问题,但是答案中提供的示例没有给我任何使用方法的线索。
问题:Replacing ::class in PHP 5.4
在PHP 5.4中,有一个问题是无法使用`::class`语法来获取类的完全限定名称。解决这个问题的方法是将数组中的值替换为类的完全限定名称。
解决方法是将类`Example`的命名空间`foo\bar`写入数组中,而不是使用`Example::class`语法,只需写入`foo\bar\Example`即可。
然而,这个问题并不是由用户自己的代码引起的,而是由Composer包的代码引起的。在任何使用Composer进行构建/部署的过程中,这些更改都会被覆盖。
但是,由于我无法通过SSH访问生产环境来运行Composer,所以在本地机器上使用Composer是唯一的选择。因此,编辑包的代码是一种可行的解决方法。
另外,有一种更好的方法是fork该项目。
另外需要注意的是,在生产环境中并不一定需要Composer,你可以在本地运行它并将依赖项提交到项目中。有些人认为这是一种更具弹性的部署方法,因为这样不依赖外部可用性来进行部署。
替换PHP 5.4中的::class的出现原因是因为使用::class可以返回类的完整命名空间。但是在一些新的包中,最好给类指定命名空间并在该类中创建实例。使用::class更简短和更方便。例如:
protected static $classmap = [ 'getTransactionResult' => 'Namespace\of\the\class', ]
这种写法更长,当你在这个位置出现这样的问题时,我相信当你使用新包时会遇到更多的问题。
感谢答案。有没有办法知道一个类的完整命名空间?如果我可以在我的本地机器上获取完整的命名空间,我可以编辑代码使其工作。
只需通过打开类文件来检查类的命名空间,它应该位于顶部。还可以参考[secure.php.net/manual/en/language.namespaces.php](https://secure.php.net/manual/en/language.namespaces.php)。
我在文件的顶部有所有这些use语句。这些是我应该使用的吗?[所有use语句的截图](http://imgur.com/Jzu7DOc)。