【问题标题】:php global variable overhead in a framework框架中的php全局变量开销
【发布时间】:2011-09-08 09:05:31
【问题描述】:

我目前正在开发一个使用Core 类对象的框架(该类具有巨大的功能并使框架工作)。该框架遵循 MVC 架构并具有松散耦合的模型、控制、视图类。这些类需要大量引用Core 类。到目前为止,我所做的是:创建 Core 类的单个对象并在模型、控制、视图类中通过 PHP 关键字 global 引用它。

我不喜欢使用这种方法主要是因为:

  • 在我看来,这种方式不是真正的面向对象方式
  • IDE (netbeans) 无法为 Core 类的对象提供文档 - 对于将使用此框架的开发人员来说是个难题。
  • 我真的很担心性能问题 - 不知道 global 是不是更慢了。

我已搜索并没有找到任何有关性能问题的信息。我还搜索了 stackoverflow 并找到了 Does using global create any overhead?The advantage / disadvantage between global variables and function parameters in PHP? 等链接,但它们不包含太多信息。 现在我主要关心的是性能,所以请帮忙。

【问题讨论】:

  • 如果你真的关心性能,你应该已经针对不同的场景做了一些测量。
  • 不,实际上我没有根据不同的可能场景进行任何模拟。我缺乏软件测试方面的知识。任何帮助都将不胜感激
  • 循环访问全局(例如在其上调用无操作函数)。在另一个循环中以其他方式(非全局)访问它。 Measure the time taken by each loop.
  • 使用共享范围(这就是 PHP 中的全局变量实际上是什么)与 OOP 无关。这只是另一种语言功能。试图不惜一切代价避免某些事情通常包括性能。

标签: php performance frameworks global


【解决方案1】:

我必须同意 NevilleK,你的 Core` 类听起来符合 God Object 反模式。

对于任何愚蠢到建议使用单例/注册表的人,我建议对该主题进行一些研究。它们创建与经典全局变量相同的全局状态。

全局状态与性能无关(尽管在 php 中它有一些小影响),但它创建了不可测试且紧密耦合的代码。

你真的应该研究一下依赖注入。这可能会向您展示另一种方式,它不需要在您的代码中包含这样的Core 类。


为您提供一些额外的视频:

【讨论】:

  • P.S 如果你对 MVC 和 php 最佳实践感兴趣,那么 StackOverflow 的聊天可能是一个经常去的好地方(php 频道)。
【解决方案2】:

我通过为adding object 创建不同的模式并在系统范围内使用它,解决了Agile Toolkit 中的类似问题。这会将一个属性传递给一个名为“api”的新创建对象,该对象始终引用Application class

应用程序类并不是真正的上帝类,但它将各种功能委托给系统控制器、页面等。此截屏视频解释了非常基本的对象是如何构造的,您可能也在寻找它:

http://www.youtube.com/watch?v=bUNEHqYVOYs

【讨论】:

    【解决方案3】:

    首先,当您关心性能时,您可能需要先阅读http://en.wikipedia.org/wiki/God_object - 您的“核心”类听起来像一个“上帝对象”,这是一个相当成熟的反模式。

    就性能而言 - 找出答案的最佳方法是对其进行测试。如果您正在编写一个框架,我假设您正在编写单元测试来验证它的行为;扩展该单元测试以包含简单的性能指标并不难。您还可以投资于使用 JMeter 或类似工具的测试脚本,以练习使用该框架构建的几个页面的“参考实现”。通过这样做,您将获得关于您的具体情况的更好的信息,而不是尝试基于 Stack Overflow 对一般工作方式的集体知识来优化设计。

    一般来说,我会说拥有一个全局类不会对性能产生太大影响,只要它没有做太多工作即可。简单地将类加载到内存中,对其进行解析等确实会对性能产生影响 - 但它不太可能比您可能采用的任何其他路线慢得多。

    但是,如果您的“核心”类在被页面访问时执行大量初始化逻辑,那么它显然会影响性能。

    【讨论】:

    • 谢谢。 Core 类实际上包含其他重要类的一些对象。 Core 本身并没有很多成员函数,但它有其他类的对象,它们组合在一起,使框架工作。那有多糟糕? :|
    • “好”和“坏”不是很有用的术语——你必须看看影响你的项目的力量,并在这种情况下评估你的选择。例如,如果您正在构建的项目很小,不会发展或成长,并且始终由同一个团队从事该项目,那么“神级”并不是什么大不了的事。性能同上——通常,优化性能意味着权衡一些其他特性(通常是可维护性)。有时,这是必要的 - 但也有“足够快”足够好的时候。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 2019-03-20
    相关资源
    最近更新 更多