目前Laravel 5.5默认包含hamcrest/hamcrest-php v1.2.2。 根据我的错误日志,hamcrest 正在用 is()
等函数污染 php 全局命名空间。
[2018 年 1 月 17 日星期三 15:50:14.130470] [php7:错误] [pid 30809] [客户端 70.178.240.6:62075] PHP 致命错误:无法在第 2603 行的/[censored]/laravel/vendor/hamcrest/hamcrest/hamcrest-php/hamcrest/hamcrest.php:306 中重新声明 is(((之前在/[censored]/functions.php 中声明
像这样的库不应该被命名吗? 我错过了什么吗?
可以使用命名空间的静态方法代替全局函数:
use HamcrestMatchersAssert as h;
use HamcrestMatchers as m;
h::assertThat(array(), m::anArray());
要删除全局函数,您需要查找并删除/注释掉声明它们的位置。要删除的声明可能采用以下三种形式之一:
-
require vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest.php
或 -
HamcrestUtil::registerGlobalFunctions();
或 作曲家.json 中的以下行
"autoload-dev": { "files": ["vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest.php"] }
使用命名空间静态方法而不是全局函数的缺点是h::assertThat()
比assertThat()
稍微不那么简洁,请记住,使用 Hamcrest 的吸引力之一是测试代码更干净、更简单。
有关此内容的更详细讨论,请参阅 https://github.com/hamcrest/hamcrest-php/issues/45。