我刚刚开始学习Symfony2(过去两年使用1.x之后),并且因为需要多少输入而有点迟疑。我知道这听起来很懒散,但我喜欢这样一个事实:我可以快速获得一些东西并在1.x中运行而不那么打字。我想知道是否可以自动加载类而无需使用名称空间。我所有这样做的尝试(使用PEAR命名方案)都失败了。
如果我遗漏了一些显而易见的东西,并且会通过避免使用命名空间来自我射击,我会感激任何建议:)
回应@KingCrunch:
我想避免在Symfony2中经常使用的namespace
和use
声明,只是为了加快我的编码速度。说实话,我以前没有在PHP中使用过命名空间。我理解他们在纸上的好处(我以前习惯使用其他语言的包)但我从来没有遇到过而不是在Symfony 1.x项目中使用它们的问题。这就是为什么我在上面做了“如果我遗漏了某些东西......”的说法。
答案 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周围,但我认为这比使用namespace
和use
更麻烦;)
起初我也对它感到沮丧,并不喜欢它的使用方式。但是,一旦我习惯了它并开始看到它的好处,它就是另一种方式。我在自己的项目中使用sf2并且必须在工作中使用sf1.4(不是很长,希望如此)并且每次从sf2切换到sf1.4时我都会感觉到“哦,不是这样”。
答案 2 :(得分:-3)
我知道答案的重点不是让代码“完美”,但仍然......你忘了为“Class”类包含use语句:
namespace Foo\Bar;
use Some\Long\Class\Name;
use The\Extended\Class;
...
这就是为什么命名空间很可怕 - 只需要忘记1来抛出错误;而且,即使整个项目中只有一个名为“Class”的类,PHP也不知道它在那里。