2013-07-19 30 views
36

我使用的是PHP 5.4,並且具有類似於以下內容的PSR-0類結構。不能使用X作爲Y,因爲名稱已在使用中,儘管它不是

A \圖書館\ session.php文件

namespace A\Library; 

class Session { ... } 

我\應用\ session.php文件

namespace My\Application; 

class Session { ... } 

我\應用\ Facebook.php

namespace My\Application; 
use A\Library\Session; 

class Facebook { ... } 

當我嘗試運行應用程序時,我得到以下錯誤:

Cannot use A\Library\Session as Session because the name is already in use in My\Application\Facebook.php

即使它不是,至少不是在這個文件中。 Facebook.php文件僅聲明Facebook類,並且只導入一個Session類,即A\Library類。

我可以看到的唯一問題是另一個Session類與Facebook類存在於相同的名稱空間中,但由於它從來沒有在Facebook.php文件中導入,所以我認爲它根本就沒有關係。

我錯了嗎(在這種情況下請指向相關文檔),還是這是一個錯誤?

+0

可能需要更多的代碼,因爲我目前沒有看到問題 – exussum

+0

在我的情況下,我在命名空間中犯了一個錯誤... –

回答

23

PHP中證實的錯誤可能會影響你看到的行爲。它應該是致命的錯誤,但啓用opcache後,它仍然可以完美無缺地執行。

https://bugs.php.net/bug.php?id=66773

如果還是涉及您,請投給了錯誤。

+0

看起來這確實是一個錯誤,而不是其他答案所說的。您提到的錯誤和[#66862](https://bugs.php.net/bug.php?id=66862)已於2016年11月10日修復。 – Benjamin

+1

重新啓動服務器上的php-fpm爲我解決了這個問題 – didiliche

+0

@ dliche可能因爲PHP自上次重新啓動以來已更新。 – Benjamin

10

The only problem I can see is that another Session class exists in the same namespace as the Facebook class, but as it was never imported in the Facebook.php file, I thought it did not matter at all.

是的,這非常重要。這就是爲什麼你不需要從同一個命名空間「導入」類。如果來自不同名稱空間的名稱相互衝突,則需要別名類。

namespace My\Application; 
use A\Library\Session as ASession; // choose a proper alias name here 

class Facebook { ... } 
+0

我仍然不明白爲什麼。對我來說,如果我使用'My \ Application'中的Session,並且沒有'use'用於這個,那麼它會將它解析爲'My \ Application \ Session'。但是如果有的話,它會使用這個。文檔清楚地表明導入是*每個文件*,那麼爲什麼它會查找另一個文件中定義的類? – Benjamin

+0

這不是導致問題的使用聲明。問題是\ My \ Application命名空間有一個\ My \ Application \ Session類。因此,如果您將另一個Session類導入到您的\ My \ Application命名空間的範圍內(通過使用),您將有一個衝突的Session類。 –

+0

但是因爲PHP是一種動態語言,那應該不重要,因爲當時解釋器可能不知道這個名字空間中有一個Session類? – Benjamin

22

不,這不是一個錯誤。正如Using namespaces: Aliasing/Importing提到

use A\Library\Session;

是一樣的:

use A\Library\Session as Session; 

因此,嘗試使用類似:

use A\Library\Session as AnotherSessionClassName; 
+0

正如我對約翰·卡特賴特所說的那樣,它現在起作用了,我無法解釋爲什麼。看起來這不符合你的答案;你有沒有試圖自己複製它?對此有何評論? – Benjamin

+0

我試圖重現你的情況。所以我創建了你的目錄結構,即A \ Library和My \ Application以及提到的文件,並且在Facebook.php的最後添加了一些測試代碼來創建會話對象。但我不明白你如何使用'use'子句導入Session類!我添加了一個'require('../../ A/Library/Session.php');''use'語句之前,它完美的工作! – Mohsenme

+0

'use'只是在當前文件中將FQCN的短名稱別名,而'require'則執行目標文件中包含的代碼,它們完全不同!你什麼意思? – Benjamin

相關問題