2017-02-15 138 views
0

我在幾個項目中使用了不同版本的類似庫。這些庫命名空間是這樣的:PHP命名空間別名衝突?

項目A:

namespace Ewout\Project_A\Compatibility; 
Class Core {} 

項目B:

namespace Ewout\Project_B\Compatibility; 
Class Core {} 

...等

爲了避免使用完整的命名空間中無處不在,我他們的別名在項目的PHP文件中:

項目A(a/main.php):

use Ewout\Project_A\Compatibility\Core as CoreX; 

項目爲B(b/main.php):

use Ewout\Project_B\Compatibility\Core as CoreX; 

這是好嗎?項目腳本可以同時加載,儘管我不需要在同一個文件中將Project_A\Compatibility\CoreProject_B\Compatibility\Core類別別名化。全局命名空間中沒有CoreX類(從我的測試看來,它看起來不會導致任何問題,但?)。

我測試過,並沒有看到PHP抱怨衝突的任何錯誤,但要確保這不會導致問題的發展。

+1

這不會造成任何衝突。但在詢問之前測試你的代碼。 – Ad5001

+0

我測試過這個:「我還沒有看到任何PHP抱怨衝突的錯誤,但是要確保這不會導致問題的發生。」 – Ewout

+0

哦,抱歉沒有看到它。但是很長一段時間你並沒有將/ main.php和/b/main.php結合起來,那就沒有任何問題。 – Ad5001

回答

0

做進一步測試我可以證實,這不會導致任何問題。 PHP在每個文件的基礎上處理別名,因此即使包含在主腳本中,一個文件中的別名也不會影響別名中的別名。

此外,這有助於瞭解底層過程:

如何不合格的類名像名解析?

不包含類似名稱的反斜槓的類名可以通過兩種不同的方式解析。

如果有一個導入語句將別名另存爲名稱,則應用導入別名。

否則,當前名稱空間名稱被預置爲名稱。

這意味着,當有一個在具有相同的名稱作爲別名全局命名空間中的一類,這不會造成任何直接衝突,它將簡單的別名在全局命名空間中的類優先。在PHP文檔

更多有用信息:FAQ: things you need to know about namespaces