是否可以在spl_autoload_registry中扩展具有相同类但路径不同的命名空间类

时间:2014-07-23 19:22:39

标签: php namespaces composer-php autoload spl-autoload-register

我有两个带有相同命名空间和类的composer的命名空间类。 (PSR4)

//directory1/Foo/Bar.php
namespace Foo;

class Bar{
    ....
}

我有第二个目录,它具有相同的命名空间用于覆盖。

//directory2/Foo/Bar.php
namespace Foo;

class Bar{
    ....
}

现在,如果我将directory1和directory2都注册为自动加载器,则directory2将优先于directory1。 使用这种方法,我可以通过备用目录完全覆​​盖类。

调用新的Foo \ Bar时;

我将获得directory2 / Foo / Bar.php的实例

如果文件没有在第二个目录中退出,我将得到一个实例:

我将得到一个directory1 / Foo / Bar.php的实例

这很好,但我遇到了一个问题。

虽然我可以完全覆盖,但似乎无法扩展以这种方式设置的类。

在directory2 / Foo中找到的Bar是否可以扩展在directory1 / Foo中找到的Bar,因为它们共享一个命名空间和类名?

1 个答案:

答案 0 :(得分:0)

我强烈反对让自动加载决定加载哪个版本的类的想法。

如果您创建两次相同的类,两个版本之间可能存在差异,那么任何其他程序员(包括您自己一段时间后)将会混淆哪个类真正包含您的程序中使用的正确代码。

此外,所有进行大量代码索引和解析的IDE也会感到困惑,并表示可能会使用两种可能的类。

没有人会从两个不同的文件中获得任何好处,这两个文件具有完全相同的类名但代码中存在差异。

你没有说明你想用这种方法解决哪个问题,但我认为你应该这样做!在解决面向对象编程问题时,自动加载不应起任何作用。