在 PHP 中使用静态方法和属性是否使用较少的内存?

我正在开发一个 Web 应用程序,该应用程序每秒可以看到数十个并发用户。我有一个类,它将在同一页面加载中多次实例化。在该类中,我有一些属性在每个对象中始终相同,因此我正在考虑声明这些属性,以减少在同一页面请求期间实例化此类的多个实例时将使用的内存。static

这样做是否会为此应用程序使用更少的内存,因为PHP只能存储一次静态属性的值?这样做会节省并发用户之间的内存,还是仅在每个PHP进程中节省内存?

这如何适用于方法?如果这意味着对象可以回收相同的方法,那么如果您尝试节省内存,为什么不将类的所有方法都声明为静态呢?

我对为什么以及何时声明一个属性或方法为静态并不完全满意,但我确实理解将它们声明为静态允许在不实例化类的对象的情况下访问它们(这感觉像是一个黑客......这些方法和属性应该在其他地方...不?).我对声明影响内存使用的方式特别感兴趣,以便在我的Web服务器上保持尽可能低的内存使用率...总的来说,所以我对正在发生的事情有了更好的理解。static


答案 1

将类方法/变量声明为静态时,它将绑定到类(而不是对象)并由类共享。从内存管理的角度来看,这意味着当类定义加载到堆内存中时,这些静态对象将在那里创建。在堆栈内存中创建类的实际对象时,以及完成对静态属性的更新时,将更新指向包含静态对象的堆的指针。这确实有助于减少内存,但不会减少太多。

从编程范式来看,人们通常选择使用静态变量来获得架构优势,而不是内存管理优化。换句话说,当人们想要实现单例或工厂模式时,可能会创建您提到的静态变量。它提供了更强大的方法来了解“类”级别上正在发生的事情,而不是在“对象”级别上发生的事情。


答案 2

查看静态测试与单例测试:http://moisadoru.wordpress.com/2010/03/02/static-call-versus-singleton-call-in-php/

注意:由于某些原因,堆栈溢出没有显示多llen主题,所以我正在添加图片。

Number of runs  Singleton call time (s)     Static call time (s)
100             0.004005                    0.001511
1,000           0.018872                    0.014552
10,000          0.174744                    0.141820
100,000         1.643465                    1.431564
200,000         3.277334                    2.812432
300,000         5.079388                    4.419048
500,000         8.086555                    6.841494
1,000,000       16.189018                   13.696728

在此处查看更多详细信息: https://stackoverflow.com/a/3419411/260080


推荐