我是否需要在Symfony2中使用命名空间?

时间:2011-07-30 01:09:32

标签: php namespaces symfony

我刚刚开始学习Symfony2(过去两年使用1.x之后),并且因为需要多少输入而有点迟疑。我知道这听起来很懒散,但我喜欢这样一个事实:我可以快速获得一些东西并在1.x中运行而不那么打字。我想知道是否可以自动加载类而无需使用名称空间。我所有这样做的尝试(使用PEAR命名方案)都失败了。

如果我遗漏了一些显而易见的东西,并且会通过避免使用命名空间来自我射击,我会感激任何建议:)

回应@KingCrunch: 我想避免在Symfony2中经常使用的namespaceuse声明,只是为了加快我的编码速度。说实话,我以前没有在PHP中使用过命名空间。我理解他们在纸上的好处(我以前习惯使用其他语言的包)但我从来没有遇到过而不是在Symfony 1.x项目中使用它们的问题。这就是为什么我在上面做了“如果我遗漏了某些东西......”的说法。

3 个答案:

答案 0 :(得分:3)

您必须意识到命名空间不再需要您输入比PEAR样式名称更多的输入。实际上他们可以节省一些角色。

见这两个例子:

使用PEAR风格:

class Foo_Bar_Baz extends Foo_Bar_Parent
{
    public function __construct()
    {
        $obj = new Some_Long_Class_Name;
        $obj2 = new Some_Long_Class_Name;
    }
}

使用名称空间/使用:

namespace Foo\Bar;

use Some\Long\Class\Name;

class Baz extends Class
{
    public function __construct()
    {
        $obj = new Name;
        $obj2 = new Name;
    }
}

使用命名空间,但没有用:

namespace Foo\Bar;

class Baz extends \Foo\Bar\Class
{
    public function __construct()
    {
        $obj = new \Some\Long\Class\Name;
        $obj2 = new \Some\Long\Class\Name;
    }
}

如您所见,如果您每次都使用完全限定的类名(最后一个示例),则每个类名称只有一个char,即前导\。如果使用use语句和all语句,那么在一个文件中重复使用相同的类名,或者在同一名称空间中使用的类越多,它就越短。

TL; DR:无论如何,如果你很懒,可以使用像PhpStorm这样的IDE来自动完成所有这些并为你添加使用语句。

答案 1 :(得分:1)

简答:是的,如果你想使用Symfony2,名称空间是必须的。

这背后的原因是sf2类自动加载器是基于命名空间用法构建的。理论上,您可以编写自己的自动加载器并将其包装在sf2周围,但我认为这比使用namespaceuse更麻烦;)

起初我也对它感到沮丧,并不喜欢它的使用方式。但是,一旦我习惯了它并开始看到它的好处,它就是另一种方式。我在自己的项目中使用sf2并且必须在工作中使用sf1.4(不是很长,希望如此)并且每次从sf2切换到sf1.4时我都会感觉到“哦,不是这样”。

答案 2 :(得分:-3)

NS非常复杂,甚至在试图解释某人的好处时甚至会犯错:

我知道答案的重点不是让代码“完美”,但仍然......你忘了为“Class”类包含use语句:

namespace Foo\Bar;

use Some\Long\Class\Name;
use The\Extended\Class;
...

这就是为什么命名空间很可怕 - 只需要忘记1来抛出错误;而且,即使整个项目中只有一个名为“Class”的类,PHP也不知道它在那里。