【问题标题】:Importing a namespace vs. including files in PHP导入命名空间与在 PHP 中包含文件
【发布时间】:2013-03-04 06:47:54
【问题描述】:

我从 PHP 4 开始构建我的代码库。我使用 require_once 导入类。现在使用 PHP 5.3,我遇到了定义名称空间并导入它们。

我想更改我的源文件以使用导入(use 语句)而不是使用require_once。这是正确的决定吗,我不确定。

我想这很容易。在类文件的顶部定义命名空间并对使用它们的其他文件进行搜索和替换(将require_once 替换为use)。在实践中可能会出现什么问题?

会有性能提升吗?在包含文件时,很明显 PHP 如何找到文件。但是在导入命名空间时,它并不那么明显。搜索命名空间并通过 PHP 对其进行索引是否有性能损失?

【问题讨论】:

  • 命名空间是一种避免具有相同名称的类之间发生冲突的方法,同时需要加载类。使用自动加载功能比多次使用 require 更好。

标签: php namespaces


【解决方案1】:

userequire_once 是完全不同的东西。 use 根本没有进行任何文件导入。 use 只是让您的生活更轻松。而不是每次都写Full\Path\To\Class,你可以这样做

use Full\Path\To\Class

$bar = new Class();

您仍有责任包含正确的文件。

您可以依赖PHP auto class loading,而不是手动加载所有文件。

您可以使用 ComposerSymfony 2Zend2 等框架,它们会为您处理所有自动加载内容。

迁移现有代码以使用自动加载和use 语句而不是include_once 可能非常耗时。很可能没有搜索和替换解决方案。

【讨论】:

  • 谢谢,我没有注意到自动加载类。然而,这听起来像是一种不好的做法,只能用解释器语言来实现。它增加了诸如搜索类的整个路径之类的开销,并导致您不知道哪个文件使用什么的不良文档。
  • 我没有看到任何性能问题,因为 auf 自动加载类。如果您使用上述工具,您会发现它们在确保快速查找方面做了很多工作。毕竟,Java 已经成功地做到了十多年。最后但同样重要的是:依赖简单的包含/类加载规则可以大大简化您的代码。
  • @bkilinc :像 PSR-0 这样的标准允许您在整个应用程序中使用一致的自动加载规则。如果您的整个库都应用相同的标准,您可以为您的整个应用程序使用单个自动加载器。这使您可以编写非常模块化的 OOP 代码,而无需担心依赖关系,同时将性能开销降至最低。
  • @JohnSlegers :谢谢,问这个问题已经有一段时间了。现在我的类库已经完全重构,广泛使用命名空间和类重载。我对遗留代码使用单个自动加载器和查找表。我更喜欢在代码中声明导入(require's),但我的 IDE 管理它们的功能并不强大,而且我更喜欢坚持 Zend Framework 标准。
  • @bkilinc :就我个人而言,我使用自己创建的轻量级零配置自动加载器。它会自动从一个或多个可配置路径加载与 PSR-0 标准 (github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md) 兼容的任何库。它也不需要作曲家。
猜你喜欢
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
  • 2018-06-02
  • 1970-01-01
  • 2014-09-06
  • 2019-03-11
  • 2020-01-01
相关资源
最近更新 更多