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

时间:2018-01-17 22:01:52

标签: php laravel laravel-5.5 hamcrest

目前,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

不应该像这样的库被命名空间吗?我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

您可以使用命名空间的静态方法代替全局函数:

use Hamcrest\MatchersAssert as h;
use Hamcrest\Matchers as m;

h::assertThat(array(), m::anArray());

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

  1. require vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest.php
  2. Hamcrest\Util::registerGlobalFunctions();
  3. composer.json中的以下行

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

使用命名空间的静态方法而不是全局函数的弊端在于,h::assertThat()assertThat()更加精简,请牢记使用Hamcrest的吸引力之一是测试代码更干净,更简单

有关此问题的更详细讨论,请参见https://github.com/hamcrest/hamcrest-php/issues/45

相关问题