2013-07-13 100 views
4

如果我有相同的第三方庫(或類)的不同版本,它們當然具有相同的名稱空間和類名稱。有沒有辦法將它們包含在同一個項目中,避免名稱衝突?PHP包含相同庫的不同版本

當我們有一個單獨開發組件的模塊化項目時,會發生此問題的另一種情況。所以我們可以有不同的模塊,它們在自己的文件夾中包含相同的外部庫文件,但是當模塊被加載時,我們會遇到類衝突。

本文Loading multiple versions of the same class

的用戶建議使用此代碼:

namespace old { 
    include /lib/api-1.0/library.php; 
} 
namespace foo { 
    include /lib/api-2.0/library.php; 
} 

$oldlibary = new old\Library(); 
$newlibrary = new foo\Library(); 

,但當然這是行不通的。無論如何,因爲它們被宣佈爲gobally而不是vars,所以類會發生碰撞。

因此,有沒有另一種解決方案不是手工編輯庫中包含的所有名稱空間?

在此先感謝

+0

'new'是一個關鍵字,它不會像命名空間一樣工作。 –

+1

這很棘手,因爲函數和類在包含在全局範圍內時被定義。變量不是。 – Rainulf

回答

3

這是在模塊化系統中一個非常普遍的問題。在PHP中,你可以嘗試用很糟糕的黑客(EVAL,的file_get_contents,str_replace函數)來解決它,但你會失去很多有用的工具支持(回溯,調試,操作碼緩存,精確的錯誤報告,只是僅舉幾例)。

解決這些問題的常用方法是使用某種依賴性管理。例如。在java maven中使用最多次,在scala中它是maven或sbt和php的人會正常使用composer(從來沒有使用過這個,所以我不完全確定它是否好或者它是否支持你所需要的) 。

這些工具通常有一些算法來檢測和解決典型的版本衝突。但是,如果兩個相互矛盾的版本是兼容的(或至少正在使用的部分是兼容的),這隻會工作。他們會選擇一個提供的版本,選擇一些版本(有時很奇怪)或讓你決定使用哪個版本。但是,當然,他們也無法解決在相同命名空間內肯定需要兩個版本的問題。

一般說,最簡單的方法是使用百達相同的庫或模塊版本全公司範圍內或至少應用廣泛。上面的工具將幫助你。

對不起,不幫助你與你的具體問題,但我希望一些所提供的關鍵字會出現一些對你有用。

+0

感謝您的回覆:)我已經郵寄的PHP開發者在這裏解釋這個問題:news.php.net/php.internals/68115但是似乎作曲家不能以任何方式解決這個問題,因爲我在這裏說:HTTP:// news.php.net/php.internals/68126 – Joseph

相關問題