我目前正在开发一个使用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对一般工作方式的集体知识来优化设计。
一般来说,我认为拥有一个全局类不应该对性能有太大的影响,只要它不做太多的工作。简单地将类加载到内存中,对其进行解析等,确实会对性能产生影响——但它不太可能比您可能采用的任何其他路由慢得多。然而,如果你的"核心"类在被页面访问时做了大量的初始化逻辑,这显然会影响性能。