2015-10-03 27 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; 
    } 
} 

希望它能幫助!