名称已在使用使用使用composer';PHPUnit中的自动加载

名称已在使用使用使用composer';PHPUnit中的自动加载,php,phpunit,composer-php,Php,Phpunit,Composer Php,使用PSR-4自动加载Composer,当我尝试测试此类时: namespace User; use User\Contracts\UserId; use User\Contracts\User as UserContract; class User implements UserContract { private $id; public function __construct(UserId $id) { $this->id = $id;

使用PSR-4自动加载Composer,当我尝试测试此类时:

namespace User;

use User\Contracts\UserId;
use User\Contracts\User as UserContract;

class User implements UserContract
{
    private $id;

    public function __construct(UserId $id)
    {
        $this->id = $id;
    }

    public function getId()
    {
        return $this->id;
    }
}
使用PHPUnit:

use User\Contracts\UserId;

class UserTest extends \PHPUnit_Framework_TestCase
{
    public function test_the_identifier_can_be_used_as_string()
    {
        $identifier = m::mock(UserId::class);
        $identifier->shouldReceive('__toString')->once()->andReturn('foo');

        $user = new User($identifier);

        $this->assertSame('foo', (string) $user->getId());
    }
}
我在控制台中收到此错误

PHP Fatal error:  Cannot use User\Contracts\UserId as UserId because the name is already in use in /src/User/User.php on line 5
这是文件/文件夹结构:

src
`-- User
    |-- Contracts
    |    |-- User.php
    |    `-- UserId.php
    |-- User.php
    `-- UserId.php
tests
`-- User
    |-- UserIdTest.php
    `-- UserTest.php
我已经做了很多关于这个问题的搜索,但我没有找到任何解决方案

  • PHP版本:5.6.13-1+deb.sury.org~trusty+3
  • PHPUnit版本:5.0.3
  • 操作系统:Ubuntu 14.04.3 LTS
如何解决此问题?

请尝试以下操作:

use User\Contracts\UserId as UserIdContract;
可能是因为你正在做的事情,你会遇到命名冲突

use User\Contracts\UserId;
但是在用户类的同一名称空间中也有UserId

所以


希望有帮助

不能将类导入到已在其中使用相同别名声明的命名空间中

您拥有
\User\UserId
并希望将
\User\Contracts\UserId
导入
\User
命名空间。这将使快捷方式
UserId
变得模棱两可

您可以在导入时使用别名,也可以直接使用相对路径:

namespace User;

class User implements Contracts\User
{
    private $id;

    public function __construct(Contracts\UserId $id) {}
}
更新2018-03-20:

有一个bug报告抱怨如果在没有操作码缓存的情况下使用PHP会触发此错误,但在其他情况下不会。原因是,使用opcache时,编译是针对每个文件进行的,并且合理的期望是只考虑文件的内容。但是,错误似乎在于,以前加载的文件中的现有类定义在导入“冲突”类时会造成阻碍

对于PHP7.0.13,它是以正确的方式修复的:每个文件都只说明它自己,如果您希望导入一个类并使用它的简写名称,那么您可以这样做,而不考虑名称空间中可能存在的任何其他类。您只是失去了对这些类的访问——这是不相关的,因为您的代码一开始没有使用它们。如果你想改变这一点,你就必须改变导入

由于opcache通常在命令行上被禁用,因此在使用PHPUnit时可能会触发此错误

namespace User;

class User implements Contracts\User
{
    private $id;

    public function __construct(Contracts\UserId $id) {}
}