2015-10-03 31 views
2

使用PSR-4自动加载与作曲家,当我试图测试这个类:使用PHPUnit的名称已在使用致命的错误使用作曲家的自动加载PHPUnit中

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; 
    } 
} 

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〜可信赖+ 3
  • PHPUnit的版本:5.0.3
  • 操作系统:Ubuntu的LTS 14.04.3

如何我可以解决这个问题吗?

回答

4

你不能将一个类导入到已经在其中声明了相同别名的名称空间中。

您有\User\UserId并且想要将\User\Contracts\UserId导入\User命名空间。这会使快捷方式UserId陷入困境。

http://php.net/manual/en/language.namespaces.importing.php#117334

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

namespace User; 

class User implements Contracts\User 
{ 
    private $id; 

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

尝试以下操作:

use User\Contracts\UserId as UserIdContract; 

可能你得到一个命名冲突,因为你正在做

use User\Contracts\UserId; 

但你也有用户ID用户的同一个命名空间班。

所以......

namespace User; 

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

class User implements UserContract 
{ 
    private $id; 

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

    public function getId() 
    { 
     return $this->id; 
    } 
} 

希望它能帮助!