PHP名称空间问题

PHP名称空间问题,php,namespaces,Php,Namespaces,我正在尝试使用外部库。 因为存在一些冲突,我正在使用名称空间(PHP5.3) 目标根本不是更改外部库(只是在顶部添加名称空间) 问题是在图书馆内部,有几种情况不起作用 is_a($obj,'3thpartyclassname')仅当我在3thpartyclassname前面添加名称空间时才起作用 第三方使用本机类,但只有在我打开全局空间(new\Exception)时它们才起作用 有没有办法不做任何修改就完成这项工作 更新 使用\异常作为异常;解决问题2 我只对is_a和is_的子类有问题。

我正在尝试使用外部库。 因为存在一些冲突,我正在使用名称空间(PHP5.3)

目标根本不是更改外部库(只是在顶部添加名称空间)

问题是在图书馆内部,有几种情况不起作用

  • is_a($obj,'3thpartyclassname')
    仅当我在3thpartyclassname前面添加名称空间时才起作用
  • 第三方使用本机类,但只有在我打开全局空间(
    new\Exception
    )时它们才起作用
有没有办法不做任何修改就完成这项工作

更新 使用\异常作为异常;解决问题2


我只对is_a和is_的子类有问题。它们都需要名称空间并忽略当前名称空间

不,您必须进行一些修改

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
方法的
是一个
是子类要求您输入完全限定的类名(包括名称空间)。据我所知,从PHP5.3.5开始就没有办法解决这个问题。不过,使用
instanceof
应该可以解决这两个问题

导入本机类(如Exception)也应该有效,例如

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

有关更多信息,请参阅。

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