命名空间与在PHP中包含/要求的优缺点?


20

我最近开始在PHP中使用名称空间。当我第一次看到它们时,我认为它们的语法很丑陋,我永远不会使用它们。但是,我创建了一个自动加载器(spl_autoload_register),这样就不必再编写include / require语句了。

我喜欢名称空间,但是与include / require语句相比有客观的好处吗?或者它们是实现相同目标的完全相同的方法吗?


1
命名空间可防止与第三方库发生冲突。
Reactgular

1
现在,对我来说,有关名称空间的主要好处是自动加载。例如,我new \Vendor\Namespace\Class()在方法或类的前面使用内联而不需要require语句。
NobleUplift 2013年

3
许多PHP库使用不带名称空间的自动加载。PHP应该使名称空间成为必需。
Reactgular

我没有意见。我想在这里看到所有这些更改。
NobleUplift 2013年

Answers:


21

命名空间不仅用于自动加载类。它们还可以防止命名冲突。实际上,这是他们的主要目的。

假设您有一个项目,该项目需要一个名为的类User来存储有关您的应用程序用户的信息,但是插件也使用一个名为(不同)的类User来存储信息。命名空间使您可以在一个命名空间(例如MyApp)中创建类,并让插件使用另一个命名空间(例如CoolPlugin)。MyApp空间中的代码只能引用User(例如new User();),因此CoolPlugin空间中的代码也可以引用。每个都将获得预期的结果。当您需要使用另一个命名空间中的代码时,只需为其加上前缀即可。例如,在代码CoolPlugin空间可以访问UserMyApp通过new \MyApp\User();

另一种选择是,每个类在任何地方都需要一个复杂的名称,例如class MyApp_Userclass CoolPlugin_User。命名空间使您可以在大多数时间简化事情,并避免始终命名冲突。

编辑:要回答这个问题,“两者之间是否存在性能差异?”

没有意义的,不。我尚未对其进行基准测试,但是纳秒级可能有所不同。就是说,牺牲代码质量以进行超小型性能调整不是一个好策略,因此无论如何都应使用名称空间。有关类似问题的基准,请参阅PHPbench.com此StackOverflow答案

你的代码需要令人难以置信的紧张和令人难以置信的时间敏感(认为高频交易或管理核反应),你需要担心的微优化它在这种情况下之前。如果确实是时间敏感的,那么您可能应该使用甚至是进行编码,而不是像PHP这样的解释语言。


1
+1我只是注意到,每个项目似乎开始似乎都不需要名称空间,然后很容易地增长到这样的地步,以至于在没有它们的情况下乱搞事情变得荒谬。没有名称空间与应用于类的全局声明每个变量基本相同。在较大的代码库或自由使用库的代码库中,这完全是一团糟。
BrianH 2013年

1
请在上方查看我的修改。
elixenide

2
我是否提到我正在为大型强子对撞机制作PHP接口?否则,我相信这个答案就足够了,谢谢。
NobleUplift 2013年

1
请不要创建任何夸克星或黑洞!乐意效劳。
elixenide

1
别担心,只有奇怪。我们正在制造强子炮-我是说,这是科学而不是武器。
NobleUplift 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.