2011-03-17 120 views
7

我試圖使用外部庫。 因爲有一些衝突,我使用的命名空間(PHP 5.3)PHP命名空間問題

不改變在所有(只是增加頂部的命名空間)

的問題是庫裏面有外部庫的目標是不工作

  • is_a($obj,'3thpartyclassname')幾種情況只有當我在3thpartyclassname前加上命名空間的工作
  • 該屆黨使用了本地類,但如果我apped全局空間,他們不僅工作(new \Exception

任何方式使這項工作沒有任何修改?

更新 use \ Exception as Exception;修復問題2

我只有is_a和is_subclass_of有問題。他們都需要命名空間並忽略當前的命名空間。

回答

12

不行,你必須做一些修改

namespace My\Own\Namespace;    // declare your own namespace 
use My\ThirdParty\Component;    // import 3rd party namespace 
$component = new Component;    // create instance of it 
var_dump(is_a($component, 'Component')); // FALSE 
var_dump($component instanceof Component); // TRUE 

is_ais_subclass_of方法要求你把在完全合格的類名(包括命名空間)。據我所知,從PHP 5.3.5開始沒有辦法。儘管使用instanceof應該解決這兩個基地。

導入本機類,例如Exception也應該起作用,例如,

namespace My\Own\Namespace; 
use \Exception as Exception; 
throw new Exception('something broke'); 

查看chapter on Namespace in the PHP Manual瞭解更多信息。

0

我不認爲有什麼辦法可以讓is_a()尊重相對的命名空間(比如當前命名空間或者使用use命令導入的命名空間)。這是因爲它需要一個字符串參數並在不同的上下文中執行。您需要改爲使用instanceof語法。所以不,我認爲這不會幫助你避免在兩個庫都與全局命名空間相沖突的情況下發生衝突,你仍然必須找到像這樣的實例並直接解決它們。