框架中的php全局变量开销

框架中的php全局变量开销,php,performance,frameworks,global,Php,Performance,Frameworks,Global,我目前正在开发一个框架,它使用一个核心类的对象(这个类有巨大的功能&使框架工作)。该框架遵循MVC架构&具有松散耦合的模型、控件和视图类。这些类需要引用核心类。到目前为止,我所做的是:创建Core类的单个对象&在Model、Control、View类中通过PHP关键字global引用它 我不喜欢使用这种方法,主要是因为: 在我看来,这种方式不是真正的面向对象方式 IDE(netbeans)不能为核心类的对象提供文档,这对于将使用此框架的开发人员来说是一件痛苦的事情 我真的很担心性能问题-不知道

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

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

  • 在我看来,这种方式不是真正的面向对象方式
  • IDE(netbeans)不能为
    核心
    类的对象提供文档,这对于将使用此框架的开发人员来说是一件痛苦的事情
  • 我真的很担心性能问题-不知道
    global
    是慢还是什么

我已经搜索了&没有找到任何关于性能问题的信息。我也搜索了stackoverflow&found&etc链接,但它们不包含太多信息现在我主要关心的是性能,所以请帮助。

首先,当您关心性能时,您可能需要先阅读-您的“核心”类听起来像“上帝对象”,这是一个相当成熟的反模式

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

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

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

我必须同意,您的核心类听起来像是一个反模式

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

全局状态与其说是性能的问题(尽管在php中它有一些小的影响),不如说它创建了不稳定且紧密耦合的代码

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


为您准备的一些附加视频:


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

Application类并非真正的God类,但它将各种功能委托给系统控制器、页面等。此屏幕广播解释了非常基本的对象是如何构造的,您可能也在寻找:


如果您真的关心性能,您应该已经对不同的场景进行了一些测量。不,实际上我没有根据不同的可能场景进行任何模拟。我缺乏软件测试方面的知识。在循环中访问全局(例如,对其调用不执行任何操作的函数)时,任何帮助都是非常值得赞赏的。在另一个循环中以其他方式访问它(无全局)。使用共享范围(这就是PHP中的全局变量)与OOP无关。这只是另一种语言特性。不惜一切代价避免某些事情通常包括性能。谢谢。
Core
类实际上包含其他重要类的一些对象
Core
本身没有很多成员函数,但它有其他类的对象,这些对象一起使框架工作。那有多糟|“好”和“坏”并不是非常有用的术语——你必须考虑影响你的项目的因素,并在这种情况下评估你的选择。例如,如果您正在构建的项目很小,不会发展或成长,并且同一个团队总是在项目上工作,“上帝类”并不是什么大问题。性能也是如此——通常,性能优化意味着要权衡其他一些特性(通常是可维护性)。有时候,这是必要的——但也有一些时候“足够快”就足够好了。P.s如果你对MVC和php最佳实践感兴趣,那么StackOverflow的聊天可能是一个经常聊天的好地方(php频道)。