【问题标题】:PHP: Require() and Class HierarchiesPHP:Require() 和类层次结构
【发布时间】:2010-11-19 04:38:24
【问题描述】:

我主要是 C++/C# 程序员考虑这个问题,这可能有助于正确看待问题。我无法为我的问题找到一个简单的答案,所以如果那里有现成的可用答案,我深表歉意。这似乎是一个非常普遍的问题。

假设我有 class A,它是 class B 实例的容器。 class B 又是 class C 实例的容器。通过容器,我的意思是每个类都包含一组特定类型的对象和一些描述这些对象的通用参数。每个类都存储在[className].php中

现在,我有一个脚本需要构建 A 类的实例。为此,它需要构建 C 类的实例。每组都将用于构建 B 类的实例,最后,所有的 B 类都将用于构建 A 类的实例。

问题是,在 PHP 中,哪里是放置 require() 语句的最佳(最不容易出错)的地方?一些想法:

  • require() 脚本中的所有三个类,其他任何地方都没有
  • require_once() 任何你需要使用它们的类。在这种情况下,脚本中需要 require_once() A、B 和 C,A 中需要 B 和 C,B 中需要 require_once() C。
  • require() 只需要层次结构中下一层的类。脚本需要(A),A 需要(B),B 需要(C)。因此,通过在脚本中要求 A,您可以访问填充 A 所需的所有类。
  • 其他的,比如自动加载。

一如既往,我很欣赏这些想法。虽然这在某种程度上可能是主观的,但我确实相信某些方式在客观上可能比其他方式更好,这就是我所追求的。

【问题讨论】:

  • 不要把事情复杂化。使用自动加载。

标签: php oop class-design require


【解决方案1】:

始终使用require_once 来包含类。 总是。从字面上看没有缺点。通过require_once 在需要的每个文件中包含文件。这不会失败:您不能多次使用require_once,并且保证该类在整个程序中都包含并可用。

【讨论】:

  • +1 但只需要您在源文件中实际使用的类。
  • 实际上,有一个潜在的缺点,那就是(稍微)降低性能。在此处阅读更多信息:techyouruniverse.com/software/…
  • @MathieuK 试图优化 PHP 是没有意义的。输出缓存使基于 PHP 的优化完全没有意义。
  • 我不同意,在很多情况下输出缓存根本不是一种选择。
【解决方案2】:

我会选择自动加载。如果它会自动为您完成,您不必担心require_once() 您的课程在哪里。您所要做的就是开始使用您希望出现的类,PHP 将调用您的自动加载器以确保这些类已加载。

如果您更习惯于在每个文件的顶部导入内容的环境中进行编程,那么在所有文件的顶部使用 require_once() 可能会更舒服。我几乎更喜欢这个而不是自动加载,因为它非常清楚每个类的依赖关系是什么。然而,你会得到很多你可能不喜欢的重复。

任何一种方式都有效。它主要是一种风格选择。

【讨论】:

  • 如果在这种情况下使用自动加载,你把自动加载功能放在哪里?在每个可执行的 php 文件中?
  • 基本上是的,但实际上您只需要在任何“可执行”代码中包含 __autoload() 的文件。还要检查 spl_register_autoload() - 这将为您提供更大的灵活性(尽管可能会略微降低性能)。
  • 文件顶部的use 语句描述类依赖关系是否足够好?
  • 我现在选择简单地 require_once() 任何依赖项,因为我喜欢很容易看到我正在使用的内容,并且它使代码对其他人更清晰。但是,对于一个有很多文件的大型程序,或者我有非常高并发的情况,我可能会考虑使用自动加载来代替,
猜你喜欢
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-07
  • 1970-01-01
  • 2011-05-19
  • 2015-01-09
  • 1970-01-01
相关资源
最近更新 更多