目前,Laravel 5.5默认包含hamcrest / hamcrest-php v1.2.2。根据我的错误日志,hamcrest使用is()
等函数来污染php全局命名空间。
[Wed Jan 17 15:50:14.130470 2018] [php7:error] [pid 30809] [client 70.178.240.6:62075] PHP致命错误:无法重新声明是()(之前在/ [censored] / laravel中声明) /vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest.php:306)在第2603行的/[censored]/functions.php
不应该像这样的库被命名空间吗?我错过了什么吗?
答案 0 :(得分:0)
您可以使用命名空间的静态方法代替全局函数:
use Hamcrest\MatchersAssert as h;
use Hamcrest\Matchers as m;
h::assertThat(array(), m::anArray());
要删除全局函数,您需要查找并删除/注释声明它们的位置。要删除的声明可能采用以下三种形式之一:
require vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest.php
或Hamcrest\Util::registerGlobalFunctions();
或composer.json中的以下行
"autoload-dev": {
"files": ["vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest.php"]
}
使用命名空间的静态方法而不是全局函数的弊端在于,h::assertThat()
比assertThat()
更加精简,请牢记使用Hamcrest的吸引力之一是测试代码更干净,更简单
有关此问题的更详细讨论,请参见https://github.com/hamcrest/hamcrest-php/issues/45。