【问题标题】:PHP namespaces problemsPHP命名空间问题
【发布时间】:2011-03-17 10:16:27
【问题描述】:

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

我们的目标是根本不改变外部库(只是在顶部添加命名空间)

问题出在库里面有几种情况不起作用

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

有什么方法可以在不修改的情况下使其工作?

更新 使用 \Exception 作为异常;修复问题2

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

【问题讨论】:

    标签: php namespaces


    【解决方案1】:

    不,你必须做一些修改

    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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-05
        • 1970-01-01
        • 2013-03-26
        相关资源
        最近更新 更多