我正在尝试使用外部库。 因为有一些冲突我正在使用命名空间(php 5.3)
目标不是完全改变外部库(只是在顶部添加命名空间)
问题出在库内,有几种情况不起作用
is_a($obj,'3thpartyclassname')
仅在我在3thpartyclassname new \Exception
)任何使这项工作无需修改的方法?
更新 use \ Exception as Exception;解决问题2
我只遇到is_a和is_subclass_of的问题。它们都需要命名空间并忽略当前的命名空间。
答案 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_a
和is_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
语法。所以不,我不认为这会帮助你避免两个库之间的冲突,这两个库都是针对全局命名空间编写的,你仍然需要找到这样的实例并直接解决它们。