我最近开始在PHP中使用名称空间。当我第一次看到它们时,我认为它们的语法很丑陋,我永远不会使用它们。但是,我创建了一个自动加载器(spl_autoload_register),这样就不必再编写include / require语句了。
我喜欢名称空间,但是与include / require语句相比有客观的好处吗?或者它们是实现相同目标的完全相同的方法吗?
new \Vendor\Namespace\Class()
在方法或类的前面使用内联而不需要require语句。
我最近开始在PHP中使用名称空间。当我第一次看到它们时,我认为它们的语法很丑陋,我永远不会使用它们。但是,我创建了一个自动加载器(spl_autoload_register),这样就不必再编写include / require语句了。
我喜欢名称空间,但是与include / require语句相比有客观的好处吗?或者它们是实现相同目标的完全相同的方法吗?
new \Vendor\Namespace\Class()
在方法或类的前面使用内联而不需要require语句。
Answers:
命名空间不仅用于自动加载类。它们还可以防止命名冲突。实际上,这是他们的主要目的。
假设您有一个项目,该项目需要一个名为的类User
来存储有关您的应用程序用户的信息,但是插件也使用一个名为(不同)的类User
来存储信息。命名空间使您可以在一个命名空间(例如MyApp
)中创建类,并让插件使用另一个命名空间(例如CoolPlugin
)。MyApp
空间中的代码只能引用User
(例如new User();
),因此CoolPlugin
空间中的代码也可以引用。每个都将获得预期的结果。当您需要使用另一个命名空间中的代码时,只需为其加上前缀即可。例如,在代码CoolPlugin
空间可以访问User
类MyApp
通过new \MyApp\User();
另一种选择是,每个类在任何地方都需要一个复杂的名称,例如class MyApp_User
和class CoolPlugin_User
。命名空间使您可以在大多数时间简化事情,并避免始终命名冲突。
编辑:要回答这个问题,“两者之间是否存在性能差异?”
没有意义的,不。我尚未对其进行基准测试,但是纳秒级可能有所不同。就是说,牺牲代码质量以进行超小型性能调整不是一个好策略,因此无论如何都应使用名称空间。有关类似问题的基准,请参阅PHPbench.com和此StackOverflow答案。
你的代码需要令人难以置信的紧张和令人难以置信的时间敏感(认为高频交易或管理核反应),你需要担心的微优化它在这种情况下之前。如果确实是时间敏感的,那么您可能应该使用c甚至是assembly进行编码,而不是像PHP这样的解释语言。