2011-03-17 118 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语法。所以不,我认为这不会帮助你避免在两个库都与全局命名空间相冲突的情况下发生冲突,你仍然必须找到像这样的实例并直接解决它们。