防止 Laravel Hamcrest 污染全局命名空间



目前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());

要删除全局函数,您需要查找并删除/注释掉声明它们的位置。要删除的声明可能采用以下三种形式之一:

  1. require vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest.php
  2. HamcrestUtil::registerGlobalFunctions();
  3. 作曲家.json 中的以下行

    "autoload-dev": { "files": ["vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest.php"] }

使用命名空间静态方法而不是全局函数的缺点是h::assertThat()assertThat()稍微不那么简洁,请记住,使用 Hamcrest 的吸引力之一是测试代码更干净、更简单。

有关此内容的更详细讨论,请参阅 https://github.com/hamcrest/hamcrest-php/issues/45。

相关内容

最新更新