代码之家  ›  专栏  ›  技术社区  ›  d3jn

如何解决类库导入类映射时的类模糊性?

  •  1
  • d3jn  · 技术社区  · 6 年前

    "autoload": {
        "classmap": [
            "libraries/some-lib"
        ]
    }
    

    库/some lib/Foo.php:

    class Foo
    {
        public function bar()
        {
            ...
        }
    }
    

    库/some lib/Foo-alternate.php:

    Foo类
    公共功能条()
    {
    ...
    }
    }
    

    Ambiguous class resolution 为它们生成警告,并且只生成一个版本的 Foo 将提供给我在我的项目代码通过 \Foo 因为名字冲突。

    1 回复  |  直到 6 年前
        1
  •  2
  •   rob006    6 年前

    PHP不允许两个类具有相同的名称,因此即使您可以找到解决方法(比如根据上下文从指定的文件手动加载类),但这更像是一种脆弱的黑客攻击,而不是真正的解决方案,当您尝试在同一请求中加载这两个类时,它也会失败。


    Composer是否为这种情况提供了任何选项,以便我可以将Foo类的两个版本导入Composer的类映射中,并在我的项目中区分这两个版本?

    完全限定名(对于没有名称空间的类来说只是类名)应该是唯一的,这是PHP的“限制”,Composer autoloader依赖于此。你能得到的最好的结果就是忽略这些类中的一个 exclude-from-classmap 设置:

    "autoload": {
        "exclude-from-classmap": ["libraries/some-lib/Foo-alternate.php"]
    }
    

    然后Composer将从 libraries/some-lib/Foo.php . 您仍然可以手动加载第二类( require __DIR__ . '/libraries/some-lib/Foo-alternate.php' ),但您应该对此非常小心(如果 已加载)。