在 PHP 类的开头显式定义所有使用的类和命名空间有什么好处吗?


Is there any benefit from explicitly defining all used classes and namespaces at the beginning of PHP class?

考虑以下两个类:

namespace Foo'Bar;
use LogicException;
use Memcached;
class Baz extends Memcached
{
    public function testBaz()
    {
        throw new LogicException('Not implemented');
    }
}

同一个类可以写成:

namespace Foo'Bar;
class Baz2 extends 'Memcached
{
    public function testBaz()
    {
        throw new 'LogicException('Not implemented');
    }
}

这两个类的性能是否有任何差异?如果我们使用 Composer 的优化自动加载会怎样?

还要考虑以下两个类:

namespace Foo'Bar;
use Acme'Demo;
class Kaz
{
    public function init(Demo'UnitA $unitA, Demo'UnitB $unitB)
    {
        // do something
    }
}

同样可以编码为:

namespace Foo'Bar;
use Acme'Demo'UnitA;
use Acme'Demo'UnitB;
class Kaz2
{
    public function init(UnitA $unitA, UnitB $unitB)
    {
        // do something
    }
}

同样的问题:这两者之间是否存在任何性能差异?如果我们使用作曲家优化的自动加载会怎样?

澄清问题:是否有任何性能变化?

我知道有什么用,如何别名类名等。我只是想知道使用一种/或另一种方法会降低性能。

use 运算符导入外部完全限定名称或在命名空间中为其指定别名。类是在使用它们时加载的,而不是在导入时加载的。因此,自动加载不会有任何区别。

但是在代码中使用较短的类名是一个好处,可以随时使用它。

更新

导入是在编译时执行的,因此如果您使用任何类型的操作码缓存(如 APC 或 OPcache),性能应该没有任何差异(即使您不使用任何操作码缓存,不使用 use operator 也应该是一个非常微不足道的变化)。

顺便说一句,如果您对代码的性能有疑虑,最好的办法是使用探查器。有很多像xdebug,blackfire。我个人更喜欢使用xhprof。

主要好处:你不必写那么多。对于简单的案例,例如

use 'classname;

这只是一个反斜杠,但有了更多的嵌套命名空间,它可以真正节省时间

use 'framework'section'library'someotherclass;

此外,您可以模拟类,更改使用的类而不必通过整个代码进行更改,或者使用一个具有不同名称的类两次:

use 'framework'section'library'fakeclass as realclass;

详细信息:PHP 命名空间导入