PHP命名空间问题

时间:2011-03-17 10:16:28

标签: php namespaces

我正在尝试使用外部库。 因为有一些冲突我正在使用命名空间(php 5.3)

目标不是完全改变外部库(只是在顶部添加命名空间)

问题出在库内,有几种情况不起作用

  • is_a($obj,'3thpartyclassname')仅在我在3thpartyclassname
  • 前面添加命名空间时才有效
  • 第3方使用本机类,但只有在我占用全局空间(new \Exception
  • 时它们才起作用

任何使这项工作无需修改的方法?

更新 use \ Exception as Exception;解决问题2

我只遇到is_a和is_subclass_of的问题。它们都需要命名空间并忽略当前的命名空间。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我认为没有办法让is_a()尊重相对名称空间(例如当前名称空间或使用use命令导入的名称空间)。这是因为它接受一个字符串参数并在不同的上下文中执行。您需要切换到instanceof语法。所以不,我不认为这会帮助你避免两个库之间的冲突,这两个库都是针对全局命名空间编写的,你仍然需要找到这样的实例并直接解决它们。