2013-11-01 27 views
2

在Web項目上有兩個具有相同名稱的類。到目前爲止,這個問題從來都不是問題,因爲從來沒有在同一時間/同一個腳本中使用這兩個類。PHP:有什麼選擇來重構double使用的classname?

現在我們需要在一個腳本中使用這兩個類,因此我們得到了一個「無法重新聲明類」的致命錯誤。

我的問題是:有什麼選擇來解決這個問題?

一種可能的解決方案是重命名其中一個類,但這是我非常想避免的事情 - 其中一個類是第三方軟件的一部分,不應該在此修改級別,以保持可更新。

我知道有命名空間 - 他們是這個問題的有效選擇嗎?直到現在,我從未使用過命名空間。

假設我們將其中一個類放入命名空間中:這是否可以解決問題?另外,我們需要採取什麼措施來訪問現在命名空間的課程?

+0

PSR-0調和這一切https://開頭的github .com/php-fig/fig-standards/blob/master/accepted/PSR-0.md –

+1

命名空間絕對是要走的路。所有非平凡的代碼現在都應該使用名稱空間來實現。 – arkascha

+0

當然,您可以使用命名空間。 –

回答

0

如何命名空間的工作:我們 考慮有2班命名爲用戶在文件結構

/Package1/User.php 

與內容

<?php 
    namespace Package1; 
    class user {...} 

/Package2/User.php

內容

<?php 
    namespace Package2; 
    class user {...} 

,現在由於某種原因,我們決定在一定的UserManager類中同時使用: /Package3/UserManager.php 與內容:

<?php 
    namespace /Package3; 
    use package1/User as User1; 
    use package2/User as User2; 
    class UserManager { 
     public function __construct(User1 $user1, User2 $user2) {...} 
     ... 
    } 
1

命名空間肯定能解決你的問題。 例如,我得到了多個名爲'core'的類,但是因爲它們是不同名稱空間的所有類,所以它根本不會產生任何衝突。

這確實意味着您必須遍歷所有代碼並使用正確的路徑引用命名空間類。

$item = new doubleClass(); 

將成爲

$item = new \my_namespace\doubleClass(); 

同時確保您的其他腳本沒有得到命名空間,否則將無法找到非命名空間中的類了。

+0

它不一定要查看所有內容才能將其更改爲完全限定的類名稱 - >如果您的文件someFile與該文件位於相同的命名空間'doubleClass',你不需要預先命名空間 - >所以通過仔細選擇你的名字空間並且運行一些你的當前代碼,它可能比全部更容易。 – Nanne

相關問題