框架中的PHP全局变量开销


php global variable overhead in a framework

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

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

  • 这种方式在我看来不是真正的面向对象的方式
  • IDE (netbeans)不能为Core类的对象提供文档-这对将要使用该框架的开发人员来说是一个痛苦。
  • 我真的很担心性能问题 -不知道global是否更慢或其他。

我已经搜索了&没有找到任何有关性能问题的信息。我也搜索了stackoverflow &使用全局创建任何开销吗?,在PHP全局变量和函数参数之间的优势/劣势?等链接,但他们不包含太多的信息。现在我主要关心的是性能,所以请帮助。

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

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

全局状态对性能影响不大(尽管在php中影响不大),但它会创建不可测试的紧耦合代码。

你真的应该看看依赖注入。这可能会向您展示另一种方法,这种方法不需要在代码中使用这样的Core类。


一些额外的视频给你:

  • 全局状态和单例
  • 不要找东西!
  • 高级OO模式
  • 蛋糕是谎言
  • Clean Code: Arguments

我在Agile Toolkit中解决了一个类似的问题,通过创建一个不同的模式来添加对象并在系统范围内使用它。它将一个属性传递给一个新创建的名为"api"的对象,该对象总是引用Application类。

应用程序类并不是一个真正的上帝类,但它将各种功能委托给系统控制器、页面等。这个屏幕视频解释了非常基本的对象是如何结构的,它可能是你也在寻找的东西: http://www.youtube.com/watch?v=bUNEHqYVOYs

首先,当你关心性能时,你可能想先阅读http://en.wikipedia.org/wiki/God_object -你的"核心"类听起来像一个"上帝对象",这是一个相当完善的反模式。

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

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

然而,如果你的"核心"类在被页面访问时做了大量的初始化逻辑,这显然会影响性能。