2

我有两个命名空间类,它们加载了具有相同命名空间和类的作曲家。(PSR4)

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

class Bar{
    ....
}

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

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

class Bar{
    ....
}

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

调用 new Foo\Bar 时;

我会得到一个 directory2/Foo/Bar.php 的实例

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

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

这很棒,但我有一个问题。

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

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

4

1 回答 1

0

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

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

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

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

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

于 2014-07-23T20:27:59.713 回答