【问题标题】:Some questions about the performance of PHP Objects关于 PHP Objects 性能的一些问题
【发布时间】:2010-01-24 02:26:38
【问题描述】:

现在,由于我是在 PHP 中使用对象的新手,所以我觉得在我的脑海中,我认为 PHP 对象是大而笨重的东西。这让我想减少使用它们的频率,我觉得我正在使用非常简单的代码,并且通过将它放入对象中真的过度复杂化了。

如果我有一个数据库、缓存、会话、核心和用户对象,并且我需要在彼此内部以及在其他未提及的类中访问它们,我决定将所有这些存储在一个注册表对象中。因此,由于我对对象如何工作的了解有限,在我看来,将注册表对象传递给一个简单的对象是一件非常大的事情。就像一个注册表将这 5 个对象保存在其中一样。这是错的吗?注册表真的只是传递对这些对象在内存中位置的引用吗?还是我真的将一个非常大的对象传递给我的所有对象?

对不起,如果这根本没有意义,希望它确实如此。我只是想更好地了解它们是如何与性能相关的。

【问题讨论】:

标签: php performance class object


【解决方案1】:

在 PHP5 中,默认情况下所有对象都是通过引用传递的。简单来说,引用只是“指向”实际对象或变量在内存中的位置(注意术语,因为“指针”在功能上与 PHP 的“引用”完全不同,但它们在概念上非常相似)。

当您通过引用传递对象时,您只是传递了非常小的内存指示器。对象本身没有移动......它们在内存中保持不变,并且不会移动或重写或任何东西。这包括当您将对象放入其他对象中时......只是调整了引用。

OO 设计和编程赋予您的代码的优势通常远远超过管理对象带来的小开销。请放心,PHP 解释器会以最佳方式管理对象,并且传递对象不会比传递对整数或字符串的引用产生更多开销。引用开销非常小。

【讨论】:

  • 那么根据您的经验,将所有这些对象添加到注册表对象中,然后将注册表对象注入到我需要访问其中任何内容的所有地方,这是一种很好的方法吗?
  • 这种方法听起来有利有弊。通过构造函数传递对象的依赖注入绝对是一种使您的类易于通过单元测试进行测试的方法,因此这是一个很大的优势。但是,如果您必须不断地将代码通过代码传递给每个对象,那可能会变得乏味,也许静态和/或单例方法可能会很好地为您服务。很难说,这实际上取决于它的使用方式(以及频率)。我会说,如果你的方法运行良好,那么不要太乱。 :)
【解决方案2】:

推荐阅读:PHP References

【讨论】:

  • @Bill Karwin:嘿,比尔,答案非常好!将其放入答案中,以便人们投票!
  • 虽然我同意 PHP 中的引用实现得很差,但该文章中的论点可以总结为:“不要使用引用,因为它们很难”
  • @Cfreak - 是的,作者基本上反对使用它们,但他列出的所有情况实际上都是不正确的使用引用的地方。 PHP 引用的底线基本上是“不要出于性能原因尝试显式使用它们,解释器已经涵盖了这一点。”
  • @Bill Karwin 读完之后,我想我现在困惑了 4 倍
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多